原题:https://www.vijos.org/p/1334
类型:二维01背包
其实并不是很难..就是二维而已...多套一个循环,数组多开一维即可
但是要注意要取最大值,所以加个ans(至今没想通,反正注意就是了)
时间:2014.4.4
源码(不知为何WA的比较低端的)
#include<cstdio>
#include<iostream>
using namespace std;
int v[51],g[51],k[51],f[51][401][401],vm,gm,n,ans;
int max(int x,int y)
{
if(x>y) { return x; }
else { return y; }
}
int main()
{
scanf("%d %d",&vm,&gm);
scanf("%d",&n);
for(int i=1;i<=n;i++) { scanf("%d %d %d",&v[i],&g[i],&k[i]); }
for(int i=1;i<=n;i++)
{
for(int j=vm;j>=v[i];j--)
{
for(int l=gm;l>=g[i];l--)
{
f[i][j][l]=max(f[i-1][j][l],f[i-1][j-v[i]][l-g[i]]+k[i]);
ans=max(ans,f[i][j][l]);
}
}
}
printf("%d",ans);
system("pause");
return 0;
}
空间优化过的..不知为何AC了
#include<cstdio>
#include<iostream>
using namespace std;
int v[51],g[51],k[51],f[401][401],vm,gm,n,ans;
int max(int x,int y)
{
if(x>y) { return x; }
else { return y; }
}
int main()
{
scanf("%d %d",&vm,&gm);
scanf("%d",&n);
for(int i=1;i<=n;i++) { scanf("%d %d %d",&v[i],&g[i],&k[i]); }
for(int i=1;i<=n;i++)
{
for(int j=vm;j>=v[i];j--)
{
for(int l=gm;l>=g[i];l--)
{
f[j][l]=max(f[j][l],f[j-v[i]][l-g[i]]+k[i]);
ans=max(ans,f[j][l]);
}
}
}
printf("%d",ans);
system("pause");
return 0;
}