问题描述:
0-1背包问题:给定n种物品和一背包,物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大?
在选择装入背包的物品时,对每种物品i只有两种选择,即装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品i。因此,该问题称为0-1背包问题。
用动态规划解决问题的核心思想就是建立图表,这里就不展示了。
代码实现:
#include <iostream>
using namespace std;
//比较两个数的大小,返回较大的数
int max(int a,int b)
{
if(a >= b)
return a;
else
return b;
}
//01背包动态规划算法
int KnapSack(int C, int n, int w[], int v[])
{
int V[n+1][C+1];
for(int i = 0; i <= n; i++) //初始化第0列
{
V[i][0] = 0;
}
for(int j = 0; j <= C; j++) //初始化第0行
{
V[0][j] = 0;
}
//计算第i行,进行第i次迭代
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= C; j++)
{
if(j <