Time Limit: 2000/1000 MS
(Java/Others) Memory Limit: 32768/32768 K
(Java/Others)
Total Submission(s): 6553 Accepted
Submission(s): 3016
改用一维费用背包求解./.
将背包设置为结构体来进行求解..
代码:
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 const int maxn=101; 5 struct patience 6 { 7 int a,b; 8 }; 9 patience sta[maxn]; 10 struct guawu 11 { 12 int num; //数目 13 int val; //经验值 14 }; 15 guawu dp[maxn]; 16 int main() 17 { 18 int n,m,k,s,i,g; 19 while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF) 20 { 21 for(i=0;i<k;i++) 22 scanf("%d%d",&sta[i].a,&sta[i].b); 23 memset(dp,0,sizeof(dp)); 24 for(i=0;i<k;i++) /*种类*/ 25 { 26 for(g=sta[i].b;g<=m;g++) /*忍耐度*/ 27 { 28 if(dp[g].val<=dp[g-sta[i].b].val+sta[i].a) 29 { 30 if(dp[g].val<dp[g-sta[i].b].val+sta[i].a||(dp[g].val==dp[g-sta[i].b].val+sta[i].a&&dp[g].num>dp[g-sta[i].b].num+1)) 31 dp[g].num=dp[g-sta[i].b].num+1; /*这里标记最大的容纳度*/ 32 dp[g].val=dp[g-sta[i].b].val+sta[i].a; 33 } 34 } 35 } 36 int minc=99999999; 37 int pos=m; 38 for(i=m;i>=0;i--) 39 { 40 if(dp[i].val>=n&&minc>=dp[i].val) 41 { 42 minc=dp[i].val; 43 pos=i; 44 } 45 } 46 if(dp[pos].num>s||dp[pos].val<n) 47 printf("-1\n"); 48 else 49 printf("%d\n",m-pos); 50 } 51 return 0; 52 }
HDUOJ----2159 FATE,布布扣,bubuko.com
原文:http://www.cnblogs.com/gongxijun/p/3587269.html