题解 | #购物单#
购物单
https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4
#include <iostream> #include <vector> using namespace std; int main() { int N, m; while (cin >> N >> m) { // 注意 while 处理多个 case vector<vector<int> > prices(m+1, vector<int>(3, 0)); vector<vector<int> > pricesXimportance(m+1, vector<int>(3, 0)); for(int i=1; i<=m; i++){ int v, p, q; cin>>v>>p>>q; if (q==0){ prices[i][0] = v; pricesXimportance[i][0]=p*v; }else{ if(prices[q][1]==0){ prices[q][1] = v; pricesXimportance[q][1] = p*v; }else{ prices[q][2]=v; pricesXimportance[q][2]=p*v; } } } // for(int i=0; i<=m; i++){ // for(int j=0; j<3; j++){ // cout<<prices[i][j]; // } // cout<<endl; // } vector<vector<int> > dp(m+1, vector<int>(N+1,0)); for(int i=1; i<=m; i++){ for(int j=1; j<=N; j++){ dp[i][j] = j>=prices[i][0]?max(dp[i-1][j-prices[i][0]]+pricesXimportance[i][0], dp[i-1][j]):dp[i-1][j]; dp[i][j] = j>=(prices[i][0]+prices[i][1])?max(dp[i-1][j-prices[i][0]-prices[i][1]]+pricesXimportance[i][0]+pricesXimportance[i][1], dp[i][j]):dp[i][j]; dp[i][j] = j>=(prices[i][0]+prices[i][2])?max(dp[i-1][j-prices[i][0]-prices[i][2]]+pricesXimportance[i][0]+pricesXimportance[i][2], dp[i][j]):dp[i][j]; dp[i][j] = j>=(prices[i][0]+prices[i][1]+prices[i][2])?max(dp[i-1][j-prices[i][0]-prices[i][1]-prices[i][2]]+pricesXimportance[i][0]+pricesXimportance[i][1]+pricesXimportance[i][2], dp[i][j]):dp[i][j]; } } cout<<dp[m][N]<<endl; } } // 64 位输出请用 printf("%lld")