全局最优解包含局部最优解,设定背包的容量为C,把n个宝石排列成排并编上号0,1,2,…,n-1,第i个宝石对应的体积和价值分别为V[i]和W[i], 定义d(i,j)为前i个宝石装到剩余体积为j的背包里能达到的最大价值,状态方程:d(i, j)=max{ d(i-1, j), d(i-1,j-V[i-1]) + W[i-1] }。
#include "stdafx.h"
#include<cstdio>
#include<iostream>
using namespace std;
int max(int a, int b) { return(a > b) ? a : b; }
int knapSack(int W, int wt[], int val[], int n)
{
int i, w;
int **K;
K= new int*[n + 1];
for(int t=0;t<n+1;t++)
{
K[t] = new int[W + 1];
}
for (i = 0; i <= n; i++)
{
for (w = 0; w <= W; w++)
{
if (i == 0 || w == 0)
K[i][w] = 0;
else if (wt[i - 1] <= w)
K[i][w] = max(val[i - 1] + K[i - 1][w - wt[i - 1]], K[i - 1][w]);
else
K[i][w] = K[i - 1][w];
cout << K[i][w]<<" ";
}
cout << endl;
}
return K[n][W];
}
int main()
{
int val[] = { 50,28,64,63,23 };
int wt[] = { 40,30,50,20,60 };
int W = 100;
int n = sizeof(val) / sizeof(val[0]);
printf("%d", knapSack(W, wt, val, n));
return 0;
}
这是最基础的0/1背包问题,后续还有更多动态规划的代码可以深入研究