多重费用的完全背包 HDU2159

 1 #include <iostream>
 2 #include <cstring>
 3 
 4 using namespace std;
 5 
 6 int w1[110];
 7 int w2[110];
 8 int v[110];
 9 int dp[110][110];
10 
11 int main()
12 {
13     int n,m,k,s;
14     while(cin>>n>>m>>k>>s)
15     {
16         for(int i=0;i<k;i++)
17         {
18             cin>>v[i]>>w1[i];
19             w2[i]=1;
20         }
21         memset(dp,0,sizeof(dp));
22         for(int i=0;i<k;i++)
23         {
24             for(int j=w1[i];j<=m;j++)
25             {
26                 for(int t=w2[i];t<=s;t++)
27                 {
28                     dp[j][t]=max(dp[j][t],dp[j-w1[i]][t-w2[i]]+v[i]);
29                 }
30             }
31         }
32         int i;
33         int flag=0;
34         for(i=0;i<=m;i++)
35         {
36             for(int t=0;t<=s;t++)
37             {
38                 if(dp[i][t]>=n)
39                 {
40                     flag=1;
41                     break;
42                 }
43             }
44             if(flag)
45                 break;
46         }
47         if(flag==0)
48             cout<<-1<<endl;
49         else
50             cout<<m-i<<endl;
51     }
52     return 0;
53 }

 

posted @ 2015-07-23 09:16  相儒以沫  阅读(128)  评论(0编辑  收藏  举报