01背包问题
给定 种物品和一背包。物品 的重量是wi,其价值为vi,背包的容量为 。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?
1.动态规划
来源:【动态规划】0-1背包问题(C++)
例子:
// 【动态规划】0-1背包问题
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 100
// 最大价值表,填表
void Knapsack(int n,int c,int w[],int v[],int x[],int m[][N])
{
// 以下两个for循环是最大价值表m的最后一行
for (int j = 0;j <= c;j++)
m[n][j] = 0;
for (int j = w[n];j <= c;j++)
m[n][j] = v[n];
// 以下是表m最后一行以上的部分
for (int i = n - 1;i >= 1;i--)
{
// 背包容量<物品重量,即装不下;将m[i+1][j](下一行同列)的值赋给m[i][j]
for (int j = 0;j <= c;j++)
m[i][j] = m[i + 1][j];
// 背包容量>=物品重量,即可以装下;放:m[i][j]=m[i + 1][j - w[i]] + v[i]
//不放:m[i][j]=m[i + 1][j], 哪个价值大,就采取哪种方式
for (int j = w[i];j <= c;j++)
m[i][j] = max(m[i + 1][j], m[i + 1][j - w[i]] + v[i]);
}
}
// 将最优解存入数组
void Traceback(int n,int c,int w[],int v[],int x[],int m[][N])
{
int cTemp = c; // 临时背包容量
for (int i = 1;i <= n;i++)
{
// 价值相等,说明没有放入这个物品,0
if (m[i][cTemp] == m[i + 1][cTemp])
x[i] = 0;
//价值不相等,说明放入了这个物品,1 ,放入了一个物品,背包剩余容量为原容量-物品重量
else
{
x[i] = 1;
cTemp -= w[i];
}
}
}
int main()
{
int n,c,w[N],v