标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 437 Accepted Submission(s): 144
1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<string.h> 5 #include<stdlib.h> 6 #include<queue> 7 #include<stack> 8 using namespace std; 9 typedef struct qq 10 { 11 int x;//记入当前状态最大价值 12 int y;//记录剩余的体力 13 } mm; 14 typedef struct pp 15 { 16 int x; 17 int y; 18 int cnt; 19 int a[20]; 20 } ss;//记入面包的价值消耗以及要求 21 ss kk[22]; 22 mm dp[1<<16]; 23 int main(void) 24 { 25 int n,i,j,k,p,q; 26 scanf("%d",&k); 27 while(k--) 28 { 29 scanf("%d %d",&p,&q); 30 for(i=0; i<p; i++) 31 { 32 scanf("%d",&kk[i].x); 33 } 34 for(i=0; i<p; i++) 35 { 36 scanf("%d",&kk[i].y); 37 } 38 for(i=0; i<p; i++) 39 { 40 scanf("%d",&kk[i].cnt); 41 for(j=0; j<kk[i].cnt; j++) 42 { 43 scanf("%d",&kk[i].a[j]); 44 kk[i].a[j]-=1; 45 } 46 } 47 for(i=0; i<(1<<16); i++) 48 { 49 dp[i].x=0; 50 dp[i].y=-100; 51 } 52 int maxx=0; 53 dp[0].y=q;//初始化 54 for(i=1; i<(1<<p); i++) 55 { 56 for(j=0; j<p; j++) 57 { 58 if(i&(1<<j))//判断是否在当前的状态下 59 { 60 int c=i^(1<<j);//找这个状态的前一个状态 61 int s=0; 62 for(s=0; s<kk[j].cnt; s++)//判断要求是否成立也就是前一个状态下是否有做这个面包的要求 63 { 64 if((c&(1<<(kk[j].a[s])))==0) 65 { 66 break; 67 } 68 } 69 if(s==kk[j].cnt) 70 { 71 if(dp[c].y>=kk[j].y) 72 { 73 int cc=dp[c].x+kk[j].x; 74 if(cc>dp[i].x) 75 { 76 dp[i].x=cc; 77 dp[i].y=dp[c].y-kk[j].y; 78 } 79 if(dp[i].x>maxx) 80 { 81 maxx=dp[i].x;//更新最大值 82 } 83 } 84 } 85 } 86 87 } 88 89 } 90 printf("%d\n",maxx); 91 } 92 return 0; 93 }
标签:
原文地址:http://www.cnblogs.com/zzuli2sjy/p/5167646.html