题意:
有n件物品和容量为V的背包,输入各物品的重量c[i],价值w[i]。
求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。
题解:
i遍历每个物品,j遍历当前可拿总重量。(一维数组j倒序遍历,否则改变上次的值。)
若除本次外已拿的最大价值dp[j-ci]加上本次的价值比上次就拿够当前总重的价值大,取当前物品更新最大值;
否则不取,保持上次最值继续;
#include<iostream>
#include<cstring>
using namespace std;
int n,v,c[3402],w[3402],dp[12880];
int main()
{
memset(dp,0,sizeof(dp));
cin>>n>>v;
for(int i=1;i<=n;i++){cin>>c[i]>>w[i];}
for(int i=1;i<=n;i++){
for(int j=v;j>=c[i];j--){
if(dp[j-c[i]]+w[i]>dp[j])dp[j]=dp[j-c[i]]+w[i];
}
}
cout<<dp[v]<<endl;
}