一定要知道i,j是什么
- (i,j)集合所表示的是前i个物品,且总体积不超过j的选择方法集合
- 并不是一次就完全判断选几个,有i的限制,刚刚就卡在了这个点,一直想不明白是怎么优化的,怎么推导出来的,先看代码再解释
-
和0背包问题不同的是完全背包问题有多个选择也就是一个物品可以选多次,包括0次,1次....#include<iostream> using namespace std; const int N=1010; int dp[N][N]; int v[N],w[N]; int t=0; int main() { int n,m; cin>>n>>m; for(int i=1;i<=n;i++) cin>>v[i]>>w[i]; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(j<v[i]) dp[i][j]=dp[i-1][j]; else { dp[i][j]=max(dp[i-1][j],dp[i][j-v[i]]+w[i]); } } } for(int i=0;i<=n;i++) { for(int j=0;j<=m;j++) { cout << dp[i][j] << ' '; } cout<<endl; } cout<<dp[n][m]; return 0; }