在动态规划中,有一类经常出现的问题,即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背包问题是算法设计中的一种经典问题。它是一个组合优化问题,属于NP-hard问题。问题的描述是:给定一组物品,每个物品都有一个价值和一个重量,要求在不超过背包容量...
利用回溯法解0-1背包问题讲解 利用回溯法解0-1背包问题是子集选取问题,0-1背包问题是NP难题,回溯法可以很好地解决背包问题,以期得到最优解。 回溯法概念: * 回溯法是一个既带有系统性又带有跳跃性的搜索算法...
0-1背包问题是一种经典的组合优化问题,在计算机科学和运筹学中有着广泛的应用。它描述的是这样的场景:你有一个背包,其容量有限,而有一系列物品,每个物品都有自己的重量和价值。你的目标是在不超过背包容量的...
0-1背包问题是一个经典的优化问题,主要涉及动态规划算法的运用。在这个实验报告中,学生使用Java语言解决了一个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次(不能部分选取)。目标是在不超过背包...
动态规划求解0-1背包问题的改进算法完整解释 在计算机算法设计与分析中,动态规划法是解决背包问题的常用方法之一。所谓背包问题,是指在有限的背包容量下,如何选择物品来达到最大价值的问题。在本文中,我们将对...
利用动态规划方法求解经典0-1背包问题,仅供参考,欢迎指正
0-1背包问题是一种经典的组合优化问题,在计算机科学和运筹学中有着广泛的应用。它模拟了在资源有限的情况下如何选择物品以最大化总体价值。在这个问题中,我们有一组物品,每件物品都有一个重量和一个价值,目标是...
0-1背包问题是一种经典的组合优化问题,在许多实际场景中都有应用,比如资源分配、生产计划、投资组合优化等。该问题的基本设定是:有一组物品,每件物品都有一个重量和一个价值,且每件物品只能选择放入背包或者不...
0-1背包问题是一个经典的组合优化问题,常用于资源有限情况下的最优决策。在这个问题中,我们有n种物品,每种物品i有一个重量wi和一个价值vi,还有一个背包,它的容量是C。目标是选择一些物品放入背包,使得放入背包...
在计算机科学中,0-1背包问题是一个经典的优化问题,属于NP完全问题。该问题描述如下:假设有一个背包,其最大承重为W,现在有n个物品,每个物品都有自己的重量wi和价值vi。对于每个物品,我们只能选择放或不放,不...