http://wenku.baidu.com/view/7d0ebd8ccc22bcd126ff0ce2.html
// 最优二叉查找树.cpp : 定义控制台应用程序的入口点。
// 01背包问题。
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#define N 3// the number of real node
#define M 10
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
//int v[N+1] = {0,6,3,5,4,6};// value
//int w[N+1] = {0,2,2,6,5,4};// weight
int v[N+1] = {0,4,5,6};// value
int w[N+1] = {0,3,4,5};// weight
//int weight = 10;// total weight
int f[N+1][M+1] = {0};
int x[N+1];
for(int j=1;j<=M;j++)
for(int i=1;i<=N;i++)
{
if(w[i]>j) f[i][j] = f[i-1][j];
else
{
if(f[i-1][j]<(f[i-1][j-w[i]]+v[i]))
f[i][j] = f[i-1][j-w[i]]+v[i];
else f[i][j] = f[i-1][j];
}
}
int j=M;
for(int i=N;i>=1;i--)
{
if(f[i][j]>f[i-1][j])
{
x[i]=1;
j-=w[i];
}
else x[i]=0;
}
for(int i=1;i<=N;i++)
{
for(int j=1;j<=M;j++)
cout<<f[i][j]<<" ";
cout<<endl;
}
cout<<"most values is "<<f[N][M]<<endl;
for(int i=1;i<=N;i++)
cout<<x[i]<<" ";
cout<<endl;
system("pause");
return 0;
}
01背包优化 http://blog.csdn.net/littlestream9527/article/details/7961477
这个好一点 http://blog.csdn.net/luojinping/article/details/6900788