hdu 2159(二维完全背包)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2159

思路:dp[j][l]表示消耗了j忍耐度,杀了l个怪后获得的经验值;最后只要对dp扫一遍,找出是否有大于等于n的值,如果有,这保留此时的消耗的忍耐值;否则,输出-1;

View Code
 1 #include<iostream>
 2 const int N=110;
 3 using namespace std;
 4 struct Node{
 5     int value,cost;
 6 }node[N];
 7 int dp[N][N];
 8 
 9 int main(){
10     int n,m,k,s;
11     while(~scanf("%d%d%d%d",&n,&m,&k,&s)){
12         for(int i=0;i<k;i++){
13             scanf("%d%d",&node[i].value,&node[i].cost);
14         }
15         memset(dp,0,sizeof(dp));
16         for(int i=0;i<k;i++){
17             for(int j=node[i].cost;j<=m;j++){
18                 //限定杀怪的个数
19                 for(int l=1;l<=s;l++){
20                     dp[j][l]=max(dp[j][l],dp[j-node[i].cost][l-1]+node[i].value);
21                 }
22             }
23         }
24         int flag=false,k;
25         for(int j=0;j<=m;j++){
26             if(flag)break;
27             for(int l=1;l<=s;l++){
28                 if(dp[j][l]>=n){
29                     flag=true;
30                     k=j;
31                     break;
32                 }
33             }
34         }
35         if(flag){
36             printf("%d\n",m-k);
37         }else 
38             printf("%d\n",-1);
39     }
40     return 0;
41 }
原文地址:https://www.cnblogs.com/wally/p/2954642.html