poj 1384 完全背包
记住这个公式就OK了。for i=1..N for v=w[i]..V f[v]=max{f[v],f[v-w[i]]+v[i]}.这样就转换成为了0/1背包问题是一样的,只不过第二个循环的顺序不一样而已。
#include<iostream> #include <fstream> #define MIN(a,b) (a<b?a:b) #define INF 9999999 #define MAXN 505 #define MAX 10001 using namespace std; int t,n,d,e,g; int v[MAXN],w[MAX],f[MAX]; int main() { int i,j; freopen("in.txt","r",stdin); scanf("%d",&t); while(t--) { scanf("%d%d",&e,&g); d=g-e; for(i=1; i<=d; i++) //因为是求最小的,所以这里要设成最大 { f[i]=INF; } scanf("%d",&n); for(i=1; i<=n; i++) { scanf("%d%d",&v[i],&w[i]); } for(i=1; i<=n; i++) { for(j=w[i]; j<=d; j++) //注意这里 从w[i]开始。前面的是没必要的 { f[j]=MIN(f[j],f[j-w[i]]+v[i]); } } if(f[d]==INF) { printf("This is impossible.\n"); } else { printf("The minimum amount of money in the piggy-bank is %d.\n",f[d]); } } return 0; }
我是一名在校大学生,热爱编程,虽然起步晚了些,但我会努力的。呵呵!
数据结构 算法