您的位置:首页 > 其它

hdu 3236 Gift Hunting(背包问题)

2013-10-13 15:41 344 查看
这道题做的时候觉得很麻烦。思路不是很难,但是一直觉得时间不够用。用最暴力的解法做出来,提交勉强AC。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int dp[501][51][2];
struct node
{
int x,y;
int id;
} a[305];
int v1,v2,n;
int cmp(const void *a,const void *b)
{
return (*(node *)b).id-(*(node *)a).id;
}
int Max(int x,int y)
{
if(x>y) return x;
return y;
}
int main()
{
int cnt=1;
while(scanf("%d%d%d",&v1,&v2,&n),v1+v2+n)
{
int t=0;
for(int i=1; i<=n; i++)
{
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].id);
if(a[i].id==1) t++;
}
qsort(a+1,n,sizeof(a[0]),cmp);
memset(dp,-1,sizeof(dp));
dp[0][0][0]=0;
for(int i=1; i<=n; i++)
{
for(int j=v1; j>=0; j--)
{
for(int k=v2; k>=0; k--)
{
for(int l=1; l>=0; l--)
{
if(a[i].id==1)
{
int x,y,z;
x=y=z=-1;
if(j>=a[i].x&&dp[j-a[i].x][k][l]!=-1) x=dp[j-a[i].x][k][l]+a[i].y;
if(k>=a[i].x&&dp[j][k-a[i].x][l]!=-1) y=dp[j][k-a[i].x][l]+a[i].y;
if(l>=1&&dp[j][k][l-1]!=-1) z=dp[j][k][l-1]+a[i].y;
dp[j][k][l]=Max(Max(x,y),z);
}
else
{
int x,y,z;
x=y=z=-1;
if(j>=a[i].x&&dp[j-a[i].x][k][l]!=-1) x=dp[j-a[i].x][k][l]+a[i].y;
if(k>=a[i].x&&dp[j][k-a[i].x][l]!=-1) y=dp[j][k-a[i].x][l]+a[i].y;
if(l>=1&&dp[j][k][l-1]!=-1) z=dp[j][k][l-1]+a[i].y;
dp[j][k][l]=Max(Max(Max(x,y),z),dp[j][k][l]);;
}
}
}
}
}
int max=-1;
for(int i=0; i<=v1; i++)
{
for(int j=0; j<=v2; j++)
{
for(int k=0; k<=1; k++)
max=Max(dp[i][j][k],max);
}
}
printf("Case %d: %d\n",cnt++,max);
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: