zoukankan      html  css  js  c++  java
  • 背包路径

    以 UVA 624 CD 为例,题为简单的01背包,重点看路径的记录部分。

    代码1:

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<vector>
    using namespace std;
    const int maxn=100010;
    int dp[maxn],path[maxn],ans[maxn],w[maxn];
    int main()
    {
      int V,n,i,j,cnt;
      while(~scanf("%d",&V))
      {
        {
         cnt=0;
         fill(path,path+maxn,-1);
         fill(dp,dp+maxn,0);
        }
        scanf("%d",&n);
        for(i=1;i<=n;i++) scanf("%d",&w[i]);
        for(i=1;i<=n;i++)
        {
          for(j=V;j>=w[i];j--)
           {
             if(dp[j]<dp[j-w[i]]+w[i])
              {
                dp[j]=dp[j-w[i]]+w[i];
                path[j]=i;
              }
           }
        }
        i=dp[V];
        while(i>0)
        {
          ans[cnt++]=w[path[i]];
          i-=w[path[i]];
        }
        for(i=cnt-1;i>=0;i--)printf("%d ",ans[i]);
        printf("sum:%d
    ",dp[V]);
      }
      return 0;
    }

    代码2:

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<vector>
    using namespace std;
    const int maxn=10000;
    int dp[maxn],path[25][maxn],ans[maxn],w[maxn];
    int main()
    {
      int V,n,i,j,cnt;
      while(~scanf("%d",&V))
      {
        {
         cnt=0;
         fill(path[0],path[0]+maxn*25,0);
         fill(dp,dp+maxn,0);
        }
        scanf("%d",&n);
        for(i=1;i<=n;i++) scanf("%d",&w[i]);
        for(i=1;i<=n;i++)
        {
          for(j=V;j>=w[i];j--)
           {
             if(dp[j]<dp[j-w[i]]+w[i])
              {
                dp[j]=dp[j-w[i]]+w[i];
                path[i][j]=1;
              }
           }
        }
        j=V;
        for(i=n;i>=1;i--)
        {
          if(path[i][j])
          {
            ans[cnt++]=w[i];
            j-=w[i] ;
          } 
        }
        for(i=cnt-1;i>=0;i--)printf("%d ",ans[i]);
        printf("sum:%d
    ",dp[V]);
      }
      return 0;
    }
    本博客仅为本人学习,总结,归纳,交流所用,若文章中存在错误或有不当之处,十分抱歉,劳烦指出,不胜感激!!!
  • 相关阅读:
    Delphi 2009增强之Exit函数
    带小数的10进制转16进制
    产生指定长度的随机字符串
    在delph 2009中,利用Build Events调用UPX
    WMI信息获取
    MYSQL 存储过程学习笔记
    将窗体透明化
    倒计时
    通过程序开启XP的ClearType显示效果
    使用ODAC调用ORACLE的自定义函数和存储过程
  • 原文地址:https://www.cnblogs.com/VividBinGo/p/11366691.html
Copyright © 2011-2022 走看看