问题描述:给定n个重量为{w1, w2, … ,wn}、价值为{v1, v2, … ,vn}的物品和一个容量为C的背包,求这些物品中的一个最有价值的子集,且要能够装到背包中。
通过以下例子来解释01背包问题
分析:在解决问题之前,为描述方便,首先定义一些变量:Vi表示第 i 个物品的价值,Wi表示第 i 个物品的体积,定义f(i,j):当前背包容量 j,前 i 个物品最佳组合对应的价值.
如果 前一个物品的重量大于当前背包重量,则取不下,如果前一个物品重量小于当前背包重量,则要选择是否取走该物品 ,若取走,则 为f[i-1],[j-w[i]]+v[i],(v[i]为上一个物品的价值),若不取走,则为f[i-1][j]。直到i,j为0为止。
完整代码:
#include<stdio.h>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int f[5][9] = { 0 };
int w[5] = {0,2,3,4,5};//物品重量
int v[5] = {0,3,4,5,8};//物品价值
int main() {
int i, j;
memset(f, 0, sizeof(f));
for (int i = 1; i < 5; i++)
{
for (int j = 1; j < 9; j++)
{
if (w[i]>j)
{
f[i][j] = f[i - 1][j];
}
else
{
f[i][j] = max(f[i-1][j],f[i-1][j-w[i]]+v[i]);
}
}
}
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 9; j++)
{
printf("f[%d][%d]=%d\n", i, j, f[i][j]);
}
}
}