constint M =1010;int N, V, v[M], w[M], dp[M];intmain(){
cin >> N >> V;for(int i =1; i <= N;++i)
cin >> v[i]>> w[i];// 未优化for(int i =1; i <= N;++i){for(int j =0; j <= V;++j){
dp[i][j]= dp[i -1][j];if(j >= v[i]) dp[i][j]=max(dp[i][j], dp[i][j - v[i]]+ w[i]);}}// 滚动数组优化for(int i =1; i <= N;++i)for(int j = v[i]; j <= V;++j)
dp[j]=max(dp[j], dp[j - v[i]]+ w[i]);
cout << dp[V];return0;}
多重背包
分析过程与完全背包类似,但是数量有限制
未优化版:按照第 i 个物品个数枚举
constint M =1010;int N, V, v[M], w[M], s[M], dp[M][M];intmain(){
cin >> N >> V;for(int i =1; i <= N;++i)
cin >> v[i]>> w[i]>> s[i];for(int i =1; i <= N;++i){for(int j =0; j <= V;++j){for(int k =0; k <= s[i]&& k * v[i]<= j;++k)
dp[i][j]=max(dp[i][j], dp[i -1][j - k * v[i]]+ k * w[i]);}}
cout << dp[N][V];return0;}