0-1背包问题
1.最优子结构性质(用剪贴思想证明)
y1,y2,… yn如果是一个最优解,因若不然,z2,z3,…zn是上述子问题的最优解,从而y1,z2,z3,…zn是0-1背包问题的最优解,这与y1,y2,… yn是最优解矛盾
2.递归关系
m(i,j)=max{m[i+1][j],m(i+1,j-wi)+vi} j>=wi
m[i][j]=m[i+1][j] 0<=j<wi
m[n][j]=vn j>=wn
m[n][j]=0 0<=j<wn
算法代码如下,m[1][c]就是最优解
【回溯得到最优解】:如果m[1][c]=m[2][c],则x1=0,否则x1=1.
当x1=0时,m[2][c]继续构造最优解,当x1=1时,m[2][c-wi]继续构造最优解
#define N 10000 + 1
template<class type>
type knapsack(int n, type c, type v[N], type w[N], type m[N][N], int x[N])
{
int jmax = MY_MIN(w[n] - 1, c);
int i, j;
for (j = 0; j <= jmax; ++j) m[n][j] = 0;
for (j = w[n]; j <= c; ++j) m[n][j] = v[n];
for (i = n - 1; i > 1; --i) {
jmax = MY_MIN(w[i] - 1, c);
for (j = 0; j <= jmax; ++j) m[i][j] = m[i + 1][j];
for (j = w[i]; j <= c; ++j) m[i][j] = MY_MAX(m[i + 1][j], m[i + 1