题意: 有个储蓄罐 ,内部物品重量已知,内部可能有 n 种钱币,知道每个钱币的重量和价值,问储蓄罐内部钱币价值最少是多少。
分析: 完全背包,由于是最小价值,所以应把 数组初始为无穷大。
#include<stdio.h> #include<string.h> int f[10005]; int min(int a,int b) { return a<b?a:b; } int main() { int t,i,n,v,emp,a,b; scanf("%d",&t); while(t--) { scanf("%d%d",&emp,&v); v-=emp; f[0]=0; for(i=1;i<=v;i++) f[i]=999999; scanf("%d",&n); while(n--) { scanf("%d%d",&a,&b); for(i=b;i<=v;i++) f[i]=min(f[i-b]+a,f[i]); } if(f[v]==999999) printf("This is impossible.\n"); else printf("The minimum amount of money in the piggy-bank is %d.\n",f[v]); } return 0; }