题意:给一个储钱罐,已知空的储钱罐和装了硬币的储钱罐的质量。然后给了n种硬币的质量和价值。
问储钱罐里最少有多少钱。
解法:完全背包。注意要初始化为 INF,要正好装满,如果结果是INF,输出This is impossible.
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 const int maxn=550; 9 const int INF=0x3f3f3f3f; 10 int n,m,t; 11 int dp[100100],w[maxn],v[maxn]; 12 int main() 13 { 14 int i,j,k; 15 #ifndef ONLINE_JUDGE 16 freopen("1.in","r",stdin); 17 #endif 18 scanf("%d",&t); 19 while(t--) 20 { 21 int a,b; 22 scanf("%d%d",&a,&b); 23 int W=b-a; 24 scanf("%d",&n); 25 for(i=0;i<n;i++) scanf("%d%d",&v[i],&w[i]); 26 for(i=1;i<=W;i++) dp[i]=INF; 27 dp[0]=0; 28 for(i=0;i<n;i++) 29 { 30 for(j=w[i];j<=W;j++) 31 { 32 dp[j]=min(dp[j],dp[j-w[i]]+v[i]); 33 } 34 } 35 if(dp[W]==INF) printf("This is impossible.\n"); 36 else printf("The minimum amount of money in the piggy-bank is %d.\n",dp[W]); 37 } 38 }
时间: 2024-10-12 09:11:04