首页 > 代码库 > HDU3236 Gift Hunting
HDU3236 Gift Hunting
1 /* 2 HDU3236 Gift Hunting 3 http://acm.hdu.edu.cn/showproblem.php?pid=3236 4 dp 滚动数组 5 * 6 * 7 */ 8 #include <cstdio> 9 #include <algorithm> 10 using namespace std; 11 const int Nmax=305; 12 const int INF=1e9; 13 int dp[2][505][55][2]; 14 int v1,v2,n,ans; 15 16 struct A 17 { 18 int w; 19 int v; 20 int is; 21 }a[Nmax]; 22 23 24 void init() 25 { 26 ans=-INF; 27 } 28 29 30 int work() 31 { 32 int t=0; 33 for(int j=0;j<=v1;j++) 34 for(int k=0;k<=v2;k++) 35 dp[t][j][k][0]=dp[t][j][k][1]=dp[t^1][j][k][0]=dp[t^1][j][k][1]=-INF; 36 dp[t^1][0][0][0]=0; 37 for(int i=1;i<=n;i++) 38 { 39 for(int j=0;j<=v1;j++) 40 { 41 for(int k=0;k<=v2;k++) 42 { 43 int v=a[i].v,w=a[i].w; 44 if(j-v>=0) 45 { 46 dp[t][j][k][0]=max(dp[t][j][k][0],dp[t^1][j-v][k][0]+w); 47 dp[t][j][k][1]=max(dp[t][j][k][1],dp[t^1][j-v][k][1]+w); 48 } 49 if(k-v>=0) 50 { 51 dp[t][j][k][0]=max(dp[t][j][k][0],dp[t^1][j][k-v][0]+w); 52 dp[t][j][k][1]=max(dp[t][j][k][1],dp[t^1][j][k-v][1]+w); 53 } 54 if(!a[i].is) 55 { 56 dp[t][j][k][1]=max(dp[t][j][k][1],dp[t^1][j][k][1]); 57 dp[t][j][k][0]=max(dp[t][j][k][0],dp[t^1][j][k][0]); 58 dp[t][j][k][1]=max(dp[t][j][k][1],dp[t^1][j][k][1]); 59 dp[t][j][k][0]=max(dp[t][j][k][0],dp[t^1][j][k][0]); 60 } 61 dp[t][j][k][1]=max(dp[t][j][k][1],dp[t^1][j][k][0]+w); 62 } 63 } 64 t^=1; 65 for(int j=0;j<=v1;j++) 66 for(int k=0;k<=v2;k++) 67 dp[t][j][k][0]=dp[t][j][k][1]=-INF; 68 } 69 t^=1; 70 for(int j=0;j<=v1;j++) 71 for(int k=0;k<=v2;k++) 72 { 73 ans=max(ans,dp[t][j][k][0]); 74 ans=max(ans,dp[t][j][k][1]); 75 } 76 return max(-1,ans); 77 } 78 79 80 int main() 81 { 82 //freopen("4.in","r",stdin); 83 int cases=0; 84 while(1) 85 { 86 cases++; 87 scanf("%d%d%d",&v1,&v2,&n); 88 if(!n && !v1 && !v2) 89 break; 90 for(int i=1;i<=n;i++) 91 scanf("%d%d%d",&a[i].v,&a[i].w,&a[i].is); 92 init(); 93 printf("Case %d: %d\n\n",cases,work()); 94 } 95 return 0; 96 }
HDU3236 Gift Hunting
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。