01背包问题

#include<iostream>
#include <algorithm>
using namespace std;

int w[5] = { 0, 2, 3, 4, 5 };            //商品的体积2、3、4、5
int v[5] = { 0, 3, 4, 5, 6 };            //商品的价值3、4、5、6
int bagV = 8;                            //背包大小
int dp[5][9] = {0};                        //动态规划表,用来表示背包中物品的最大价值
int item[5];                            //最优解情况

void findMax() {                       //动态规划
    for (int i = 1; i <= 4; i++) {
        for (int j = 1; j <= bagV; j++) {
            if (j < w[i])           //j用来表示背包的容量,当容量小于物品的体积是则不装
                dp[i][j] = dp[i - 1][j];
            else
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
        }
    }
}

void findWhat(int i, int j) {                //最优解情况
    if (i >= 0) {
        if (dp[i][j] == dp[i - 1][j]) {
            item[i] = 0;
            findWhat(i - 1, j);
        }
        else if (j - w[i] >= 0 && dp[i][j] == dp[i - 1][j - w[i]] + v[i]) {  //dp[i - 1][j - w[i]] + v[i]表示上一次的价值加上这次加上物品的价值的总价值
            item[i] = 1;
            findWhat(i - 1, j - w[i]);
        }
    }
}

void print() {
    for (int i = 0; i < 5; i++) {            //动态规划表输出
        for (int j = 0; j < 9; j++) {
            cout << dp[i][j] << ' ';
        }
        cout << endl;
    }
    cout << endl;

    for (int i = 0; i < 5; i++)            //最优解输出
        cout << item[i] << ' ';
    cout << endl;
}

int main()
{
    findMax();
    findWhat(4, 8);
    print();
    cin.get();
    return 0;
}
原文地址:https://www.cnblogs.com/z2529827226/p/11623754.html