二维费用01背包
AcWing1022
思路和01背包基本一样,就是从原来的一个约束条件变成了两个而已
朴素三维代码(超内存)
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int v[110], w[110];
int m, s, n;
int f[110][510][1010];
int main()
{
cin >> m >> s >> n;
for(int i = 1; i <= n; i ++)
{
cin >> v[i] >> w[i];
}
for(int i = 1; i <= n; i ++)
{
for(int j = 0; j <= m; j ++)
{
for(int k = 0; k < s; k ++)
{
f[i][j][k] = f[i-1][j][k];
if(j >= v[i] && k >= w[i])
{
f[i][j][k] = max(f[i][j][k], f[i-1][j-v[i]][k-w[i]] + 1);
}
}
}
}
int res = 0;
for(int i = 0; i < s; i ++)
{
if(f[n][m][i] == f[n][m][s-1])
{
res = i;
break;
}
}
printf("%d %d\n", f[n][m][s-1], s-res);
return 0;
}
优化掉一维后(ac代码)
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int v[110], w[110];
int m, s, n;
int f[1010][510];
int main()
{
cin >> m >> s >> n;
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 --)
{
for(int k = s - 1; k >= w[i]; k --)
{
f[j][k] = max(f[j][k], f[j-v[i]][k-w[i]] + 1);
}
}
}
int res = 0;
for(int i = 0; i < s; i ++)
{
if(f[m][i] == f[m][s-1])
{
res = i;
break;
}
}
printf("%d %d\n", f[m][s-1], s-res);
return 0;
}