hdu 2159

beiao

 1 #include<iostream>
 2 #include<memory.h>
 3 #include<cstdio>
 4 using namespace std;
 5 #define maxp 102  //经验值
 6 #define maxv 102  //种类
 7 #define Max(i,j) i > j? i : j
 8 int dp[maxp][maxv];
 9 int p[maxp];  //杀掉所消耗的忍耐值
10 int w[maxv];  //杀掉所获经验值
11 int expe,pati,num,maxkill;
12 void d()
13 {
14     int i,j,l;
15     memset(dp,0,sizeof(dp));
16     for(int i = 0; i < num; i++)
17             cin>>w[i]>>p[i];
18     for(i = 0; i < num; i++)//k个种类 遍历
19     {
20         for(j = p[i]; j <= pati; j++)
21         {
22             for(l = 1; l <= maxkill; l++)
23             {
24                 dp[j][l] = Max(dp[j][l], dp[j - p[i]][l - 1] + w[i]);
25             }
26         }
27     }
28     int flag = 0;
29     int pos;
30     for(int i = 0; i <= pati; i++)
31     {
32         for(int j = 1; j <= maxkill; j++)
33         {
34             if(dp[i][j] >= expe)
35             {
36                 flag = 1;
37                 pos = i;
38                 break;
39             }
40         }
41         if(flag)break;
42     }
43     if(flag)cout<<pati - pos<<endl;
44     else cout<<"-1"<<endl;
45 }
46 int main()
47 {
48     freopen("input.txt","r",stdin);
49     while(cin>>expe>>pati>>num>>maxkill)
50     {
51 
52         d();
53     }
54     return 0;
55 }
原文地址:https://www.cnblogs.com/imLPT/p/3908626.html