zoukankan      html  css  js  c++  java
  • 01背包

    从给定的N个正数中选取若干个数之和最接近M

    阶段是:在前N件物品中,选取若干件物品放入背包中;   状态是:在前N件物品中,选取若干件物品放入所剩空间为W的背包中的所能获得的最大价值;
     
     
      决策是:第N件物品放或者不放;   
     
     由此可以写出动态转移方程:
     
      我们用f[i,j]表示在前 i 件物品中选择若干件放在所剩空间为 j 的背包里所能获得的最大价值
     
      f[i,j]=max{f[i-1,j-Wi]+Pi (j>=Wi), f[i-1,j]}
     
      这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下:“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为f[v];如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c的背包中”,此时能获得的最大价值就是f[v-c]再加上通过放入第i件物品获得的价值w。
     
    #include <iostream>
    using namespace std;
     
    char state[11][101]; /* 设 N <= 10 M <= 100 记录路径 */
    int dp[101];         /* 使用一维数组01背包 */
    int value[11];       /* 本题可将费用与价值看做同一值 */
    int i, j;
     
    void main()
    {
        int N, M;
        scanf("%d", &N);
        for(i = 0; i < N; ++i)
        {
            scanf("%d",&value[i]);
        }
     
        while(scanf("%d", &M) != EOF)
        {
            memset(dp,0,sizeof(dp));
     
            /* 01背包 */
            for(i = 0; i < N; ++i)
            {
                for(j = M; j >= value[i]; --j)
                {
                    int tmp = dp[j-value[i]] + value[i];
                    if(tmp > dp[j])
                    {
                        dp[j] = tmp;
                        state[i][j] = 1;
                    }
                }
            }
            printf("最接近值:%d\n",dp[M]);
     
            /* 输出方案 */
            i = N;
            j = M;
            while(i-- >= 0)
            {
                if(state[i][j] == 1)
                {
                    printf("%d ",value[i]);
                    j -= value[i];
                }
            }
            printf("\n");
        }
    }
  • 相关阅读:
    序列号Pickle模块
    随机数Random模块
    selenium保存cookies 实例02
    selenium读取浏览器已有Cookies 实例01
    selenium的简单演示程序
    java连接sftp服务器读取压缩包的文件(例:读取zip中的csv文件返回数组)
    java实现连接sftp服务器并下载文件到本地
    在idea中实现热部署
    java使用IText将数据导出为pdf文件(数据为excel表格样式)
    使用poi解析Excel文件转化数组形式的集合(List<String[] list)
  • 原文地址:https://www.cnblogs.com/hbf369/p/2733547.html
Copyright © 2011-2022 走看看