带限制的二重费用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

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

 

你可能感兴趣的:(HDU)