您的位置:首页 > 其它

hdu 4501 三重背包 易错点

2015-12-11 15:41 375 查看
一个小细节上弄错,调试了很久

错误的dp
for(i = 0; i < n; ++i)
{
for(j = v1; j >= 0; --j)
{
for(t = v2; t >= 0; --t)
{
for(l = k; l >= 0; --l)
{
if(j >= a[i]) dp[j][t][l] = max(dp[j][t][l], dp[j-a[i]][t][l]+val[i]);
if(t >= b[i]) dp[j][t][l] = max(dp[j][t][l], dp[j][t-b[i]][l]+val[i]);
if(l > 0) dp[j][t][l] = max(dp[j][t][l], dp[j][t][l-1]+val[i]);
}
}
}
}
这种方法会导致一件物品被重复计算

正确代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MS(x,y) memset(x,y,sizeof(x))
#define pi acos(-1.0)
using namespace std;
void fre(){freopen("t.txt","r",stdin);}
typedef long long LL;
typedef unsigned long long ULL;
const int maxn = 1000005;
const int inf = (1<<63)-1;
const double eps = 1e-8;

int dp[101][101][6],a[101],b[101],val[101];
int main()
{
fre();
int i,j,t,l,n,v1,v2,k;
while(~scanf("%d%d%d%d",&n,&v1,&v2,&k))
{
MS(dp,0);
for(i = 0; i < n; ++i)
{
scanf("%d%d%d",&a[i],&b[i],&val[i]);
}
for(i = 0; i < n; ++i)
{
for(j = v1; j >= 0; --j)
{
for(t = v2; t >= 0; --t)
{
for(l = k; l >= 0; --l)
{
int temp = 0;
if(j >= a[i]) temp = max(temp, dp[j-a[i]][t][l]+val[i]);
if(t >= b[i]) temp = max(temp, dp[j][t-b[i]][l]+val[i]);
if(l > 0) temp = max(temp, dp[j][t][l-1]+val[i]);
dp[j][t][l] = max(dp[j][t][l],temp);
}
}
}
}

printf("%d\n",dp[v1][v2][k]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: