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*/ 


原创粉丝点击