带限制的二重费用01背包 HDU3496

 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 long long int dp[1100][110];
10 
11 int main()
12 {
13     long long int T;
14     cin>>T;
15     while(T--)
16     {
17         int n,m,l;
18         cin>>n>>m>>l;
19         for(int i=0;i<n;i++)
20         {
21             cin>>w1[i]>>v[i];
22             w2[i]=1;
23         }
24         memset(dp,-1,sizeof(dp));
25         dp[0][0]=0;
26         for(int i=0;i<n;i++)
27         {
28             for(int j=l;j>=w1[i];j--)
29             {
30                 for(int t=m;t>=w2[i];t--)
31                 {
32                     if(dp[j-w1[i]][t-w2[i]]!=-1)
33                         dp[j][t]=max(dp[j][t],dp[j-w1[i]][t-w2[i]]+v[i]);
34                 }
35             }
36         }
37         int max=0;
38         for(int i=0;i<=l;i++)
39         {
40             if(max<dp[i][m])
41                 max=dp[i][m];
42         }
43         cout<<max<<endl;
44     }
45     return 0;
46 }
View Code

初值设定用来判定是否合法

原文地址:https://www.cnblogs.com/wsruning/p/4669559.html