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");
        }
    }
  • 相关阅读:
    C#如何防止程序多次运行的技巧
    C#导出Excel按照指定格式设置单元格属性值
    js前台遍历后台返回的Datatable数据
    Datatable数据分组
    DataTable 详解(转)
    遍历Datatable
    DataTable转Json
    键值集合List转换成datatable
    DataTable转换成实体
    泛型集合与DataSet相互转换
  • 原文地址:https://www.cnblogs.com/hbf369/p/2733547.html
Copyright © 2011-2022 走看看