0-1背包算法

思路:求出[i,背包容量]所有可能出现的情况的最优方案。i表示前i个物品的数量。
举例:背包容量为15,物品数量为N=5,每个物品的重量为w[N + 1] = {0,5,4,7,2,6},每个物品的价值为v[N + 1] = {0,12,3,10,3,6 }。

[i,背包容量]所有可能出现的情况如下:
i=0,背包容量0,求其最优解
i=0,背包容量1,求其最优解
i=0,背包容量2,求其最优解
i=0,背包容量3,求其最优解
i=0,背包容量4,求其最优解
i=0,背包容量5,求其最优解
i=0,背包容量6,求其最优解
i=0,背包容量7,求其最优解
i=0,背包容量8,求其最优解
i=0,背包容量9,求其最优解
i=0,背包容量10,求其最优解
i=0,背包容量11,求其最优解
i=0,背包容量12,求其最优解
i=0,背包容量13,求其最优解
i=0,背包容量14,求其最优解
i=0,背包容量15,求其最优解
i=1,背包容量0,求其最优解
i=1,背包容量1,求其最优解
i=1,背包容量2,求其最优解
i=1,背包容量3,求其最优解
i=1,背包容量4,求其最优解
i=1,背包容量5,求其最优解
i=1,背包容量6,求其最优解
i=1,背包容量7,求其最优解
i=1,背包容量8,求其最优解
i=1,背包容量9,求其最优解
i=1,背包容量10,求其最优解
i=1,背包容量11,求其最优解
i=1,背包容量12,求其最优解
i=1,背包容量13,求其最优解
i=1,背包容量14,求其最优解
i=1,背包容量15,求其最优解
i=2,背包容量0,求其最优解
i=2,背包容量1,求其最优解
i=2,背包容量2,求其最优解
i=2,背包容量3,求其最优解
i=2,背包容量4,求其最优解
i=2,背包容量5,求其最优解
i=2,背包容量6,求其最优解
i=2,背包容量7,求其最优解
i=2,背包容量8,求其最优解
i=2,背包容量9,求其最优解
i=2,背包容量10,求其最优解
i=2,背包容量11,求其最优解
i=2,背包容量12,求其最优解
i=2,背包容量13,求其最优解
i=2,背包容量14,求其最优解
i=2,背包容量15,求其最优解
i=3,背包容量0,求其最优解
i=3,背包容量1,求其最优解
i=3,背包容量2,求其最优解
i=3,背包容量3,求其最优解
i=3,背包容量4,求其最优解
i=3,背包容量5,求其最优解
i=3,背包容量6,求其最优解
i=3,背包容量7,求其最优解
i=3,背包容量8,求其最优解
i=3,背包容量9,求其最优解
i=3,背包容量10,求其最优解
i=3,背包容量11,求其最优解
i=3,背包容量12,求其最优解
i=3,背包容量13,求其最优解
i=3,背包容量14,求其最优解
i=3,背包容量15,求其最优解
i=4,背包容量0,求其最优解
i=4,背包容量1,求其最优解
i=4,背包容量2,求其最优解
i=4,背包容量3,求其最优解
i=4,背包容量4,求其最优解
i=4,背包容量5,求其最优解
i=4,背包容量6,求其最优解
i=4,背包容量7,求其最优解
i=4,背包容量8,求其最优解
i=4,背包容量9,求其最优解
i=4,背包容量10,求其最优解
i=4,背包容量11,求其最优解
i=4,背包容量12,求其最优解
i=4,背包容量13,求其最优解
i=4,背包容量14,求其最优解
i=4,背包容量15,求其最优解
i=5,背包容量0,求其最优解
i=5,背包容量1,求其最优解
i=5,背包容量2,求其最优解
i=5,背包容量3,求其最优解
i=5,背包容量4,求其最优解
i=5,背包容量5,求其最优解
i=5,背包容量6,求其最优解
i=5,背包容量7,求其最优解
i=5,背包容量8,求其最优解
i=5,背包容量9,求其最优解
i=5,背包容量10,求其最优解
i=5,背包容量11,求其最优解
i=5,背包容量12,求其最优解
i=5,背包容量13,求其最优解
i=5,背包容量14,求其最优解
i=5,背包容量15,求其最优解


代码实现如下:

#include <iostream>
using namespace std;

int main()
{
#define N 5
#define V 15
    int B[N+1][V+1] = { 0 };
    int ans[N + 1][V + 1] = { 0 };
    int w[N + 1] = {0,5,4,7,2,6};
    int v[N + 1] = {0,12,3,10,3,6 };
    
    for (int i = 1; i <= N; i++) {
        for (int j = 0; j <= V; j++) {
            if (j >= w[i]) {
                if (B[i - 1][j] > B[i-1][j - w[i]] + v[i]) {
                    B[i][j] = B[i - 1][j];
                }
                else {
                    B[i][j] = B[i-1][j - w[i]] + v[i];
                }
            }
            else {
                B[i][j] = B[i - 1][j];
            }
        }
    }

    // 输出B数组
    for (int i = 0; i <= N; i++) {
        for (int j = 0; j <= V; j++) {
            cout << B[i][j] << " ";
        }
        cout << endl;
    }
    
    // 求出解决方案
    cout << "ans: ";
    int j = 15;
    for (int i = N; i > 0; i--) {
        if (B[i][j] != B[i-1][j]) {
            j -= w[i];
            cout << i << " ";
        }
    }
    cout << endl;
    
    return 0;
}


参考:https://blog.csdn.net/tracy_frog/article/details/79601115

发布了92 篇原创文章 · 获赞 2 · 访问量 3422

猜你喜欢

转载自blog.csdn.net/zxc120389574/article/details/105031853