码迷,mamicode.com
首页 > 其他好文 > 详细

01背包问题

时间:2019-10-05 01:01:04      阅读:95      评论:0      收藏:0      [点我收藏+]

标签:动态   color   背包   code   name   get   stream   bsp   str   

#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;
}

 

01背包问题

标签:动态   color   背包   code   name   get   stream   bsp   str   

原文地址:https://www.cnblogs.com/z2529827226/p/11623754.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!