0-1背包之C语言
01背包问题应该算是一个很经典的问题了,接下来实现一下
问题:
现给出一个容量为V
的背包和N
件物品,每件物品的体积为v[i]
,价值为c[i]
,将几件物品装入背包内,使得物品总体积不超过背包体积,并且使总价值最大,求这个最大值?
给出一组数据:
V = 8,N = 4;
i 1 2 3 4
v 2 3 4 5
c 3 4 5 6
解题思路:
用 f[i][j]
表示前 i 种物品,背包容量为 j 时的最大价值
首先初始化数组 f[][]
当 i=1 时,如果背包可以放下第一个物品,则放入,更新最大价值
基于第一行的结果和背包容量,可以选择选或者不选第二件,取最大价值
…
不断更新,直到最后一个值的时候就知道最大价值了
看下面的图:
f[i][j]
表示前 i 种物品,背包容量为 j 时的最大价值
这样就可以明显的看出来了
状态转移方程
f[i][j] = max(f[i-1][j],f[i-1][j-v[i]] + c[i])
代码部分
#include <stdio.h>
#include <stdlib.h>
#define maxn 10
#define maxv 10
int max(