题解 | #购物单#
购物单
https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4
#include <iostream> #include <vector> using namespace std; int main() { int v, n; cin>>v>>n; v/=10; int weight[n][3]; int value[n][3]; for(int i=0;i<n;i++) { weight[i][2]=0; value[i][2]=0; weight[i][1]=0; value[i][1]=0; } int q[n]; for(int i=0;i<n;i++) { cin>>weight[i][0]; weight[i][0]/=10; cin>>value[i][0]; value[i][0]*=weight[i][0]*10; cin>>q[i]; if(q[i]>0&&weight[q[i]-1][1]!=0) { weight[q[i]-1][2]=weight[i][0]; value[q[i]-1][2]=value[i][0]; } if(q[i]>0&&weight[q[i]-1][1]==0) { weight[q[i]-1][1]=weight[i][0]; value[q[i]-1][1]=value[i][0]; } } vector<int> dp(v+1,0); dp[0]=0; for(int i=0;i<n;i++) { if(q[i]>0) continue; for(int j=v;j>=1;j--) { if(j>=weight[i][0]) { dp[j]=max(dp[j],dp[j-weight[i][0]]+value[i][0]); } if(j>=weight[i][1]+weight[i][0]) { dp[j]=max(dp[j],dp[j-weight[i][1]-weight[i][0]]+value[i][1]+value[i][0]); } if(j>=weight[i][2]+weight[i][0]) { dp[j]=max(dp[j],dp[j-weight[i][2]-weight[i][0]]+value[i][2]+value[i][0]); } if(j>=weight[i][1]+weight[i][2]+weight[i][0]) { dp[j]=max(dp[j],dp[j-weight[i][1]-weight[i][2]-weight[i][0]]+value[i][1]+value[i][2]+value[i][0]); } } } cout<<dp[v]; } // 64 位输出请用 printf("%lld")