题意:有一个存钱罐,给出罐子的重量和装完钱后罐子的重量,以及n种硬币的价值和重量。问罐子装满后最少装多少钱,按照格式输出答案,无解输出 This is impossible.
题解:完全背包,注意初始化即可。
#include <bits/stdc++.h> using namespace std; const int N=1005; int t,n,sum,a,b,w[N],v[N],dp[N*N]; int main() { scanf("%d",&t); while(t--) { scanf("%d%d",&a,&b); sum=b-a; for(int i=0;i<=sum;i++) dp[i]=100000000; dp[0]=0;//这里一定要初始化为0 scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d%d",&v[i],&w[i]); for(int i=0;i<n;i++) for(int j=w[i];j<=sum;j++)//正向跑一遍 dp[j]=min(dp[j],dp[j-w[i]]+v[i]);//求最小就用min if(dp[sum]==100000000) puts("This is impossible."); else printf("The minimum amount of money in the piggy-bank is %d. ",dp[sum]); } return 0; }