直接上代码:
#includeusing namespace std; const int N=9000; int n,m; int v[N],w[N]; int f[N][N]; int main(){ 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++){ f[i][j]=f[i-1][j]; if(j>=v[i]) f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]); } } cout< 但如果用这种方法来做,有时候可能数组越界,比如说只要物品数量或能装的数量超过一万,我们就爆了,所以要简化成一维:
#includeusing namespace std; const int N=1001; int v[N]; int w[N]; int f[N]; 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=m;j>=v[i];j--){//必须从大到小,这样才不会对前面造成影响 f[j]=max(f[j],f[j-v[i]]+w[i]); } } cout< 这样就可以了,但for(int j=m;j>=v[i];j--)一定要从大到小,这样才不会对前面造成影响



