注:普通背包问题:f[i][j]=max(f[i-1][j],f[i-1][j-v]+w);
完全背包问题:f[i][j]=max(f[i-1][j],f[i][j-v]+w);
优化--实现可对空间优化--二维数组变成一维数组
思想:
代码实现:
暴力做法://优化yopuy
#include<bits/stdc++.h>
using namespace std;
int m,n,i,j;
int v[1010],w[1010];
int f[1010][1010]; int f[1010];
int main()
{
cin>>n>>m;
for(i=1;i<=n;i++)cin>>v[i]>>w[i];
for(i=1;i<=n;i++)
for(j=0;j<=m;j++) for(j=v[i];j<=m;j++)
{
// f[i][j]=f[i-1][j]; //删除
// if(j>=v[i])
// {
f[i][j]=max(f[i-1][j],f[i][j-v[i]]+w[i]);
//f[j]=max(f[j],f[j-v[i]]+w[i]); --第二个f[j]是上个循环里的值即i-1里的
--因为是正着循环 且j-v[i]<j 即f[j-v[i]]已被循环过 其已经是第i层循环里的值 也并未改变
// }
// }
printf("%d",f[n][m]); //printf("%d",f[m]);
return 0;
}