背包问题

来源:互联网 发布:怎么测试网络稳定性 编辑:程序博客网 时间:2024/06/03 19:53

全局最优解包含局部最优解,设定背包的容量为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背包问题,后续还有更多动态规划的代码可以深入研究

原创粉丝点击