在此处再解释下 dpi−1,j−useti+pricei,这个时候需要选择第 i 件物品,因为第 i 件物品需要的空间是 useti 枚举的背包容量等于 j,所以只剩下 j−useti 空间就是留给前 i−1 件物品,然后 dpi−1,j−useti 是第 i−1 件物品,背包容量剩余 j−useti 时的最大值,而现在我们又选择了第 i 件物品,所以现在的价值是 dpi−1,j−useti+pricei。
所以可以得出转移方程:
对于剩余容量大于等于选择这个物品需要的容量时
dpi,j=max(dpi−1,j−useti+pricei,dpi−1,j)
否则
dpi,j=dpi−1,j
代码:
#include<bits/stdc++.h> usingnamespace std; #define LL long long #define itn int #define ull unsigned long long int m,n,t; int dp[1050][1050]; int uset[105],price[105]; intmain(){ cin>>t>>m; for(int i=1;i<=m;i++) cin>>uset[i]>>price[i]; for(int i=1;i<=m;i++) for(int j=0;j<=t;j++){ if(j>=uset[i]) dp[i][j]=max(dp[i-1][j],dp[i-1][j-uset[i]]+price[i]); else dp[i][j]=dp[i-1][j]; } cout<<dp[m][t]; return0; }