`
hellojyj
  • 浏览: 62097 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

0/1 背包问题

阅读更多
/**
    ##########################  0/1 背包问题  #######################################


    <=动态规划方程===========================================================>

        f[i][V] 表示当背包总共容量为V的情况下,放i件物品所能获得的最大价值

        f[i][V] = max { f[i-1][V], f[i-1][V-w[i]]+p[i] }

    <=========================================================================>

    <=算法设计================================================================>

        递归算法:

        f(i,V)
        {
            if i equals 0 then do:
                return 0;
            if V < w[i] then do:
                return f(i-1,V);
            else do:
                return max(f(i-1,V),f(i-1,V-w[i]+p[i]));
        }

        递推算法:

        knapsack(int n,int V,int f[][],int p[],int w[])
        {
            for V = 1 to n do:
                f[0][V] = 0;
            for i = 1 to n do:
            {
                for j = 1 to V do:
                {
                    if(V<w[j])
                        f[i][V] = f[i-1][V];
                    else
                        f[i][V] = max(f(i-1,V),f(i-1,V-w[i]+p[i]));
                }
            }
            traceback();
            to get the answer;
        }
    <=========================================================================>
*/

//=======> C语言源代码实现 <========

#include<cstdio>
#define MAXN 20

//物品1,2...5的价值
int p[] = {0,6,3,5,4,6};
//物品1,2...5的体积
int w[] = {0,2,2,6,5,4};

//递归算法: 表示当背包总共容量为V的情况下,放i件物品所能获得的最大价值
int f(int i,int V);

//递推算法:
void knapsack(int n,int V,int ft[][MAXN],int p[],int w[]);
//回溯求最优解向量
void traceback(int x[],int n,int ft[][MAXN],int V);

//计算最大值
int max(int a,int b);

//程序执行入口
int main()
{
    printf("Using a recursive algorithm:\n");
    int maxValue = f(5,10);
    printf("when the count of goods is %d and the total volume of the bag is %d,\nthe maxValue is %d\n\n",5,10,maxValue);


    printf("Using a recursion algorithm:\n");
    int ft[MAXN][MAXN];
    knapsack(5,10,ft,p,w);
    printf("when the count of goods is %d and the total volume of the bag is %d,\nthe maxValue is %d\n",5,10,ft[5][10]);
    int x[MAXN];
    traceback(x,5,ft,10);
    printf("the best answer is (");
    for(int i=1;i<=5;i++)
        printf("%d,",x[i]);
    printf(")\n");

     return 0;
}

int max(int a,int b){
    return a>b?a:b;
}

//递归实现 p[] = {0,6,3,5,4,6}; w[] = {0,2,2,6,5,4}; 注意p,w中0只是拿来填充index = 0的时候没什么意义
int f(int i,int V)
{
    //当背包里面物品为0个的时候,价值当然为0
    if(i==0)
        return 0;

    //当所放物品的体积超过背包所提供最大体积
    //当然不能考虑把这个物品放入背包的情况
    if (V < w[i])
        return f(i-1,V);

    //当情况不是上面那样的时候
    //就要考虑把当前 i 物品放入背包
    else
        return max(f(i-1,V),f(i-1,V-w[i])+p[i]);
}

//递推算法 p[] = {0,6,3,5,4,6}; w[] = {0,2,2,6,5,4}; 注意p,w中0只是拿来填充index = 0的时候没什么意义
void knapsack(int n,int V,int ft[][MAXN],int p[],int w[])
{
    //初始化
    for(int i=0;i<=V;i++){
        ft[0][i] = 0;
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=V;j++)
        {
            if(j<w[i])
                ft[i][j] = ft[i-1][j];
            else
                ft[i][j] = max(ft[i-1][j],ft[i-1][j-w[i]]+p[i]);
        }
    }
}

//回溯寻找最优解向量
void traceback(int x[],int n,int ft[][MAXN],int V)
{
    //基本思路就是在最优解成立情况下,如果i物品被放进背包(即x[i] = 1)
    //那么ft[i][V]就是对应的最优子结构,这样给剩下物品提供的总体积减少w[i]
    //如果i物品不放进背包那么x[i] = 0,当然给剩下物品的总体积不变
    for(int i=1;i<=n;i++){
        //这一步比较就是来说明i物品有没有放进去
        //如果放进去f[i][V]和f[i-1][V]肯定是不会相同的
        if(ft[i][V]==ft[i-1][V])
            x[i] = 0;
        else{
            x[i] = 1;
            V-=w[i];
        }
    }
}

 

分享到:
评论

相关推荐

    0/1背包问题(蛮力、动态规划、回溯、分支限界法)

    ### 0/1背包问题(蛮力、动态规划、回溯、分支限界法) #### 实验背景 0/1背包问题是计算机科学中一个经典的组合优化问题,涉及到资源分配、决策选择等多个方面,在实际生活中也有着广泛的应用场景,如物流管理、...

    0/1背包问题分支界限算法c++实现

    ### 0/1背包问题分支界限算法C++实现解析 #### 背包问题概述 背包问题(Knapsack Problem)是计算机科学与数学中一个经典的优化问题,它描述了一个带有固定容量的背包如何选择一组物品,使得背包内的物品价值总和...

    用回溯算法解决0/1背包问题

    ### 使用回溯算法解决0/1背包问题 在计算机科学领域,背包问题是一类经典的组合优化问题,其中0/1背包问题是指给定一组物品,每个物品都有一个重量和一个价值,目标是在不超过背包总承重的情况下,尽可能使得所选...

    0/1背包问题相关算法

    0/1背包问题是一种经典的组合优化问题,在计算机科学和运筹学中有着广泛的应用。它描述的是这样的场景:你有一个容量有限的背包,里面有一堆物品,每件物品都有自己的重量和价值。你的目标是在不超过背包容量的前提...

    0/1背包问题

    0/1背包问题是一种经典的计算机科学中的组合优化问题,它源于实际生活中的资源分配和决策问题。在这个问题中,我们有一个容量有限的背包,需要在一组物品中选择一部分放入背包,使得背包中物品的总价值最大,但每件...

    0/1背包问题的动态规划

    ### 0/1背包问题的动态规划 #### 实验目的及要求 本次实验的主要目的是让学生通过实际编程操作来深入理解并掌握动态规划方法在解决背包问题中的应用。具体要求包括: 1. **理论掌握**:了解动态规划的基本原理...

    用动态规划法求解0/1背包问题

    0/1背包问题是一个经典的计算机科学中的组合优化问题,它在很多实际场景中都有应用,如资源分配、项目选择等。动态规划是解决这类问题的一种高效方法。在本例中,我们将通过C++语言和VC++6.0环境来探讨如何运用动态...

    0/1背包问题 动态规划 Java代码实现

    0/1背包问题是一种在计算机科学中常见的优化问题,特别是在算法设计和组合优化领域。它模拟了一个场景,其中有一个容量有限的背包,我们要从一系列物品中选择,每种物品都有自己的重量和价值,目标是使得装入背包的...

    C# 0/1背包问题过程演示源码

    0/1背包问题是一种经典的计算机科学优化问题,广泛应用于资源分配、任务选择等场景。它在C#编程中可以通过动态规划来解决。本压缩包包含的"01背包问题过程演示"源码,提供了一个直观的实现示例,旨在帮助初学者理解...

    0/1背包问题源代码

    0/1背包问题是一种在计算机科学,特别是在算法设计与分析领域常见的优化问题。它属于组合优化的范畴,常被用于解决资源分配、任务选择等问题。在这个问题中,我们有一组物品,每件物品都有一个重量和一个价值,还有...

    采用优先队列式分枝限界法求解0/1背包问 题.pdf

    在讨论采用优先队列式分枝限界法求解0/1背包问题之前,我们需要先了解0/1背包问题的基本概念。0/1背包问题是一种组合优化问题,它的目标是在不超过背包总承重的前提下,从给定的一组物品中选择物品,使得选取物品的...

    0/1背包问题快速降价法及其应用.pdf

    ### 0/1背包问题快速降价法及其应用 #### 概述 《0/1背包问题快速降价法及其应用》是一篇学术论文,由宁爱兵和马良于2005年发表在《系统工程理论方法应用》期刊上。论文主要探讨了一种针对0/1背包问题的快速降价...

    算法课程设计 背包问题 0/1背包问题 实现

    算法课程设计 背包问题 0/1背包问题 实现算法课程设计 背包问题 0/1背包问题 实现 算法课程设计 背包问题 0/1背包问题 实现算法课程设计 背包问题 0/1背包问题 实现 算法课程设计 背包问题 0/1背包问题 实现 算法...

    01背包_0/1背包问题_

    0/1背包问题是一种经典的组合优化问题,在计算机科学和运筹学中有着广泛的应用。它描述的是这样的场景:你有一个容量有限的背包,里面装有若干件物品,每件物品都有自己的重量和价值。目标是选择一部分物品放入背包...

    0/1背包问题遗传算法

    0/1背包问题是一种经典的组合优化问题,在计算机科学和运筹学中有着广泛的应用。它描述的是这样的场景:你有一组物品,每件物品都有一个重量和价值,以及一个容量有限的背包。目标是选择一些物品放入背包,使得背包...

    浅析0/1背包问题.pdf

    《浅析0/1背包问题》一文详细探讨了经典的计算机科学问题——0/1背包问题,这是一种在有限背包容量下选择若干物品以达到最大价值的优化问题。文章从问题的定义、最优子结构特性、递推关系以及实例分析等方面进行了...

    动态规划—0/1背包问题

    在“0/1背包问题”中,这个概念得到了生动的应用。 0/1背包问题是一个经典的组合优化问题,它涉及到在一个有限的背包容量下选择物品以最大化总价值。问题的背景可以是很多实际场景,比如资源分配、项目选择或者旅行...

    回溯法实现0/1背包问题

    0/1背包问题是一种经典的组合优化问题,在计算机科学和运筹学中有着广泛的应用。它描述的是这样的场景:你有一个容量有限的背包,里面要装入一些物品,每种物品都有自己的重量和价值,目标是使得背包在不超过其最大...

    0/1背包问题的两种解法--存储优化的递归和自下而上的递归(迭代法)

    0/1背包问题是一个经典的计算机科学中的优化问题,主要出现在资源有限的情况下,如何选择物品以最大化价值。在0/1背包问题中,我们有一组物品,每个物品有自己的重量和价值,还有一个固定容量的背包。每件物品只能...

    蛮力法解决0/1背包问题

    这是算法设计与分析的一个基本的算法---蛮力法,通过全部遍历解决背包问题。

Global site tag (gtag.js) - Google Analytics