AcWing 3. 完全背包问题
原题链接
简单
作者:
Newton
,
2021-01-29 15:39:53
,
所有人可见
,
阅读 303
一维
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1010;
int n, m;
int v,w;
int f[N];
int main()
{
cin >> n >> m;
for(int i=1; i<=n; i++)
{
cin >> v >> w;
for(int j=1; j<=m; j++)
{
if(j>=v) // 右边的集合不一定存在,因为集合至少包含一个物品i,但j可能<第i个物品的体积。所以有条件
f[j] = max(f[j], f[j-v]+w);
}
}
cout << f[m] << endl;
return 0;
}
二维
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1010;
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]; // i取0个一定存在,第一个集合最大值为f[i-1][j],所以先f[i-1][j]更新一下
if(j>=v[i]) // 右边的集合不一定存在,因为集合至少包含一个物品i,但j可能<第i个物品的体积。所以有条件
f[i][j] = max(f[i][j], f[i][j-v[i]]+w[i]);
}
}
cout << f[n][m] << endl;
return 0;
}