【解题报告】【HDOJ2159】【二维背包】FATE
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2159
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 //up 升级所需经验值 6 //n 怪兽种类 7 // volumn1 最大忍耐度 8 //volumn2 最多打怪数 9 //value[i] 打怪经验值 10 //cost1[i] 忍耐度的消耗 11 //cost2[i] 打怪数的消耗 12 //record[][] 二维背包 13 int record[105][105],i,j,k,n,up,volumn1,volumn2,cost1[105],cost2[105],value[105],flag; 14 //freopen("1.txt","r",stdin); 15 while(scanf("%d%d%d%d",&up,&volumn1,&n,&volumn2)!=EOF) 16 { 17 18 for(i=0;i<n;i++){ scanf("%d%d",&value[i],&cost1[i]);cost2[i]=1;} 19 20 memset(record,0,sizeof(record));//初始化背包 21 for(i=0;i<n;i++) //对于n件物品 22 { 23 for(j=cost1[i];j<=volumn1;j++) //对于忍耐度 24 for(k=cost2[i];k<=volumn2;k++)//对于怪兽数 25 if(record[j][k]<record[j-cost1[i]][k-cost2[i]]+value[i]) 26 record[j][k]=record[j-cost1[i]][k-cost2[i]]+value[i]; 27 } 28 flag=1;//如果有,则flag为0,无则为1 29 for(i=0;i<=volumn1;i++) 30 { 31 if(record[i][volumn2]>=up) //刚好升级 32 { 33 printf("%d\n",volumn1-i); 34 flag=0; 35 break; 36 } 37 } 38 if(flag) printf("-1\n"); 39 } 40 return 0; 41 }