include [HTML_REMOVED]
using namespace std;
int main()
{ int N,V,v[1010],w[1010],i,j,f[1010][1010];
cin>>N>>V;
for(j=0;j<=V;j)
f[0][j]=0;
for(int i=1;i<=N;i)//注意i表示的是第i个物品,要从1开始
cin>>v[i]>>w[i];
for(i=1;i<=N;i)
{ for(j=0;j<=V;j)
{ if(j<v[i])
f[i][j]=f[i-1][j];
else
f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]);
}
}
cout<<f[N][V];
return 0;
}
f表示的是总价值。
每到第i个物品时可以选择放进背包,也可以选择不放进背包;若选择放进背包,还要再判断是否还可以放进前i-1个物品里的某几个,并在i-1个物品里选择价值最大的放法。
因此要求出前1个、前2个......物品的最佳放法(在总体积-当前物品体积的情况下)。
分别求出第i个放与不放这两种情况下的总价值,再取较大的那个,作为当取前i个物品,要求总体积为j时使总价值最大的最佳取法。
/从昨天开始看到今天中午,代码才AC了,可还是一知半解。/