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; }
相关文章推荐
- HDU 3236 Gift Hunting(0-1背包变异)
- HDU 3236 Gift Hunting (01背包变型)
- 陈老师的多校联合20140811||HDU 3236 ||2009年武汉站G题 01背包问题
- HDU 3236 Gift Hunting - 分组背包 相当于两个01背包
- Hdu 3236 Gift Hunting(01背包变形)
- HDU 1114 Piggy-Bank(完全背包问题)
- HDU 1284 钱币兑换问题 母函数 or 完全背包
- hdu 1011 Starship Troopers(树形DP+背包问题)
- hdu 5410(背包问题变形)
- HDU 2602——最简单的背包问题
- hdu 2955 0-1背包问题
- hdu 1114 完全背包 背包问题通俗讲解
- 动态规划:HDU-2542-0-1背包问题:饭卡
- 背包问题小总结 习题(动态规划01背包(第k优解)完全背包,多重背包)acm杭电HDU2639,HDU2602,HDU1114,HDU2191
- HDU 2844 Coins (多重背包问题DP)
- HDU 2546——饭卡,背包问题
- HDU 1284 钱币兑换问题(完全背包)
- HDU 1059 背包问题
- hdu 1059 Dividing--DP-多重背包问题
- hdu-1712 分组背包问题