带限制的二重费用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 }
初值设定用来判定是否合法