zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    动态生成表格 (ng-zorro)
    单例服务
    模板变量 #
    HTML 5 系列
    关于tcp nagle算法
    netty 解包头包体的一点认知
    vargent Authentication failure.记录
    关于YII2.0配置的一点问题
    关于mysql b-tree索引的一点认知
    记vagrant nginx sendfile问题
  • 原文地址:https://www.cnblogs.com/z2529827226/p/11623754.html
Copyright © 2011-2022 走看看