标签:des style blog io ar os sp for on
解题思路,首先很容易想到方程f[v]=min(f[v],f[v-w[i]+p[i]),因为是要求当包装满的时候(因为题目中给出的是包的质量是一定的),包里面装的钱最少,所以将f[]初始化成一个很大的数。
然后对于这个循环
for(i=1;i<=n;i++)
{
for(v=w[i];v<=m;v++)
f[v]=min(f[v],f[v-w[i]+p[i]);//可以理解为只要不超过包的容量,你可以任意放入该种硬币。
}
#include<stdio.h> #define max 1000000000 int p[50005],w[10010],f[10010]; int min(int a,int b) { if(a<b) return a; else return b; } int main() { int ncase,i,v,m,e,r,n; while(scanf("%d",&ncase)!=EOF) { while(ncase--) { for(i=1;i<10010;i++) f[i]=max; scanf("%d %d",&e,&r); m=r-e; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d %d",&p[i],&w[i]); for(i=1;i<=n;i++) { for(v=w[i];v<=m;v++) f[v]=min(f[v],f[v-w[i]]+p[i]); } if(f[m]<max) printf("The minimum amount of money in the piggy-bank is %d.\n",f[m]); else printf("This is impossible.\n"); } } }
标签:des style blog io ar os sp for on
原文地址:http://www.cnblogs.com/wuyuewoniu/p/4143631.html