题意:
给出一个存钱罐的空罐时的质量和装了钱之后的质量,再给出一些硬币的质量和相应的价值,问存钱罐里的钱最少可能为多少。
这道题就是完全背包的问题,注意初始化。
完全背包与01背包不同的是第二次遍历的时候要顺序而已。
初始化,这道题要求背包恰好装满,而且要求的值尽量少,所以dp[0]=0;其余设为无穷大。
1.若没有要求恰好装满,则全为0.
2.若要求的值尽量大,则dp[0]=0;其余为无穷小。
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=10000+10; 5 const int inf=0x3f3f3f3f; 6 int dp[maxn]; 7 int main() 8 { 9 int test; 10 scanf("%d",&test); 11 while(test--) 12 { 13 int e,f; 14 scanf("%d%d",&e,&f); 15 int m=f-e; 16 dp[0]=0; 17 for(int i=1;i<=m;i++) 18 dp[i]=inf; 19 int p,w,n; 20 scanf("%d",&n); 21 for(int i=1;i<=n;i++) 22 { 23 scanf("%d%d",&p,&w); 24 for(int j=w;j<=m;j++) 25 { 26 dp[j]=min(dp[j],dp[j-w]+p); 27 } 28 } 29 if(dp[m]==inf) 30 printf("This is impossible.\n"); 31 else 32 printf("The minimum amount of money in the piggy-bank is %d.\n",dp[m]); 33 } 34 return 0; 35 }