完全:
题意:给定E,F,分别表示空的存钱罐的重量和装了钱之后的重量。
给定n种money的价值和重量
dp[ i ][ j ]:表示从前 i 种money中选出某些,使得重量至少为 j 得到的最大价值。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 完全背包 变形 3 */ 4 #include<stdio.h> 5 #include<stdlib.h> 6 #include<string.h> 7 #include<iostream> 8 #include<algorithm> 9 #include<queue> 10 #include<map> 11 #include<math.h> 12 using namespace std; 13 const int maxn = 10005; 14 const int inf = 99999999; 15 int main(){ 16 int T; 17 scanf("%d",&T); 18 while( T-- ){ 19 int E,F; 20 scanf("%d%d",&E,&F); 21 int sum=0; 22 int dp[ maxn ]; 23 int w[ maxn ],val[ maxn ]; 24 int n; 25 scanf("%d",&n); 26 for( int i=0;i<n;i++ ) { 27 scanf("%d%d",&val[ i ],&w[ i ]); 28 sum+=val[ i ]; 29 } 30 for( int i=0;i<maxn ;i++ ) dp[ i ]=inf; 31 dp[ 0 ]=0; 32 for( int i=0;i<n;i++ ){ 33 for( int j=w[i];j<=(F-E);j++ ){ 34 dp[j]=min(dp[j],dp[j-w[i]]+val[i]); 35 } 36 } 37 //for( int i=50;i<105;i++ ) printf("dp[%d]:%d\n",i,dp[i]); 38 if( dp[ F-E ]!=inf ) printf("The minimum amount of money in the piggy-bank is %d.\n",dp[F-E]); 39 else printf("This is impossible.\n"); 40 } 41 return 0; 42 } 43 44