`

0-1背包问题

 
阅读更多
在动态规划中,有一类经常出现的问题,即0-1背包问题。所谓0-1背包问题,即有n个物品,其每个背包的价值为vi(1<=i<=n),每个物品的重量为wi(1<=i<=n),背包能够放的总重量为c,求放哪几个物品使得物品的总价值最大。
很明显,物品要么放进背包,要么不放进。故称为0-1背包。
我们假设放进了m个物品{x1,x2,...,xm},那么它是满足最优子结构的,即如果这是问题的最优解,那么{x2,...,xm}一定是问题c-wx1的最优解。所以,这道问题可以用动态规划进行求解。
我们可以定义一个数组m[i][j],用它表示背包容量为j,可选物品为i,i+1,...,n时背包问题的最优值。那么我们可以推断出:
   当wi>j时,m[i][j]=m[i+1][j],当wi<=j时,m[i][j]=max{m[i+1][j],m[i+1][j-wi]+vi}。
   所以求解背包问题的代码如下:
  
#include<iostream>
#include<algorithm> 
using namespace std; 
int n; 
//计算
void cal(int *v,int *w,int c,int m[6][11]){
     
   int jMax = min(w[n-1]-1,c);
   //首先判断第n个
   for(int j=0;j<=jMax;j++) 
           m[n][j] = 0;
   for(int j=w[n-1];j<=c;j++)
           m[n][j] = v[n-1];
   //在判断2~n
   for(int i=n-1;i>=1;i--) {
           
       jMax = min(w[i-1]-1,c);
       for(int j=0;j<=jMax;j++)
               m[i][j] = m[i+1][j];
       for(int j=w[i-1];j<=c;j++)
               m[i][j] = max(m[i+1][j],m[i+1][j-w[i-1]]+v[i-1]);            
   } 
   
   bool tag[6];
   for(int i=n;i>=1;i--){
            
        if(m[i][c]!=0){
        
             tag[i]=true; 
             c=c-w[i];             
        } else{
          
             tag[i]=false; 
        } 
    } 
    for(int i=1;i<=n;i++){
            
        if(tag[i]){
        
                   cout<<i<<" ";           
        } 
    } 
} 
//背包问题 
int main() {
    
    n=5;
    int c=10;
    int w[5] = {2,2,6,5,4};
    int v[5] = {6,3,5,4,6};
    int m[6][11]; 
    cal(v,w,c,m); 
  
    cout<<endl;
    system("pause");
    return 0;    
} 
   
分享到:
评论

相关推荐

    0-1背包问题-算法简洁易懂

    0-1背包问题算法简洁易懂 0-1背包问题简介 0-1背包问题是算法设计中的一种经典问题。它是一个组合优化问题,属于NP-hard问题。问题的描述是:给定一组物品,每个物品都有一个价值和一个重量,要求在不超过背包容量...

    利用回溯法解0-1背包问题讲解

    利用回溯法解0-1背包问题讲解 利用回溯法解0-1背包问题是子集选取问题,0-1背包问题是NP难题,回溯法可以很好地解决背包问题,以期得到最优解。 回溯法概念: * 回溯法是一个既带有系统性又带有跳跃性的搜索算法...

    0-1背包问题(回溯算法)

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

    动态规划法求解0-1背包问题实验报告.pdf

    0-1背包问题是一个经典的优化问题,主要涉及动态规划算法的运用。在这个实验报告中,学生使用Java语言解决了一个0-1背包问题的实例。以下是关于这个问题和解决方案的详细解释。 一、问题描述: 0-1背包问题的核心是...

    0-1背包_0-1背包问题_背包算法_背包_

    0-1背包问题是一种经典的组合优化问题,在计算机科学和运筹学中有着广泛的应用。它源于实际生活中的装箱问题,比如如何在限定的重量限制下,选择物品以获得最大价值。在这里,我们主要探讨0-1背包问题的定义、算法...

    动态规划法和回溯法求0-1背包问题

    ### 动态规划法与回溯法解决0-1背包问题 #### 一、实验目的与背景 0-1背包问题是一种经典的组合优化问题,在实际应用中有着广泛的用途,例如资源分配、投资组合等问题都可以抽象成背包问题的形式。本实验旨在通过...

    动态规划解决0-1背包问题

    动态规划是一种有效的算法设计策略,尤其适用于解决具有重叠子问题和最优子结构的问题,而0-1背包问题就是这种策略的一个典型应用。0-1背包问题是一个经典的组合优化问题,它源自实际生活中的资源分配问题,比如在...

    0-1背包问题 (C语言编写)

    0-1背包问题是一种经典的组合优化问题,在计算机科学和运筹学中有着广泛的应用。它模拟了实际生活中的资源分配问题,例如在有限的背包容量下,如何选择物品以最大化价值。在这个问题中,每个物品都有一个重量和一个...

    0-1背包问题分支界限法求解-C语言实现

    ### 0-1背包问题分支界限法求解——C语言实现 #### 一、背景介绍 在计算机科学中,背包问题是一类优化问题的经典案例,它涉及到如何在满足一定约束条件下(例如背包的最大承重),从一系列物品中选择最优组合以达到...

    NSGA2解决0-1背包问题_nsga2_cookci7_0-1NSGA2_用NSGA2解决背包问题_

    0-1背包问题是一种经典的组合优化问题,在计算机科学和运筹学中有着广泛的应用。它描述的是这样的场景:有一组物品,每个物品有自己的价值和重量,且每件物品只能选择0次或1次(不能部分选取)。目标是在不超过背包...

    动态规划求解0-1背包问题的改进算法完整解释

    动态规划求解0-1背包问题的改进算法完整解释 在计算机算法设计与分析中,动态规划法是解决背包问题的常用方法之一。所谓背包问题,是指在有限的背包容量下,如何选择物品来达到最大价值的问题。在本文中,我们将对...

    0-1背包问题(动态规划)

    利用动态规划方法求解经典0-1背包问题,仅供参考,欢迎指正

    分支界限法求0-1背包问题

    0-1背包问题是一种经典的组合优化问题,在计算机科学和运筹学中有着广泛的应用。它模拟了在资源有限的情况下如何选择物品以最大化总体价值。在这个问题中,我们有一组物品,每件物品都有一个重量和一个价值,目标是...

    分支定界算法求解0-1背包问题(附MATLAB代码).rar

    0-1背包问题是一种经典的组合优化问题,在许多实际场景中都有应用,比如资源分配、生产计划、投资组合优化等。该问题的基本设定是:有一组物品,每件物品都有一个重量和一个价值,且每件物品只能选择放入背包或者不...

    0-1背包问题(回溯法)报告.doc

    0-1背包问题是一个经典的组合优化问题,常用于资源有限情况下的最优决策。在这个问题中,我们有n种物品,每种物品i有一个重量wi和一个价值vi,还有一个背包,它的容量是C。目标是选择一些物品放入背包,使得放入背包...

    C++ 0-1背包问题源代码

    在计算机科学中,0-1背包问题是一个经典的优化问题,属于NP完全问题。该问题描述如下:假设有一个背包,其最大承重为W,现在有n个物品,每个物品都有自己的重量wi和价值vi。对于每个物品,我们只能选择放或不放,不...

Global site tag (gtag.js) - Google Analytics