01 ,完全---背包 理解篇
来源:互联网 发布:公用的端口号 编辑:程序博客网 时间:2024/05/11 21:07
//pku3624//f[v] 把第i件物品放入容量为v的背包所获得的价值#include<cstdio>#include<cstdlib>#include<cstring>using namespace std;int max(int a,int b) {return a>b?a:b;}int val[3405],c[3405],f[100 * 3500];int main(){ int T,N,V,i,j; scanf("%d%d",&N,&V); for(i=1;i<=N;i++) scanf("%d%d",&c[i],&val[i]); memset(f, 0, sizeof(f)); for(i=1;i<=N;i++) { for(j=V;j>=c[i];j--) { f[j]=max(f[j],f[j-c[i]]+val[i]); } /* for(j=V;j>=0;j--)//观察结果 printf("%d ",f[j]); printf("\n"); */ } printf("%d\n",f[V]); system("pause"); } /*4 61 42 63 122 7*/ //ACM HDU 1114 Piggy-Bank (完全背包问题) #include<cstdio>#define INF 0x7ffffff#define min(a,b) a<b?a:bint v[505],w[505],dp[10005];int main(){ int T,E,F,N,j,i; scanf("%d",&T); while(T--) { scanf("%d%d%d",&E,&F,&N); int W=F-E; for(j=1;j<=W;j++) dp[j]=INF; dp[0]=0; for(i=0;i<N;i++) scanf("%d%d",&v[i],&w[i]); for(i=0;i<N;i++) {//填满W,所获得的最少钱数 for(j=w[i];j<=W;j++)//dp[j]表示重量为j时,money的最小值 dp[j]=min(dp[j],dp[j-w[i]]+v[i]); /* for(j=1;j<=W;j++) //观察结果 printf("%4d ",dp[j]); printf("\n"); */ } if(dp[W]==INF) printf("This is impossible.\n"); else printf("The minimum amount of money in the piggy-bank is %d.\n",dp[W]); } return 0;}/*43 1344 52 35 43 2*/