多重费用的完全背包 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 }