0-1揹包問題

https://www.bilibili.com/video/av36136952?from=search&seid=6264900200776599894

 

#include <bits/stdc++.h>
using namespace std;

class knapsack
{
private:
    vector<int> weight_ = {}; /*商品重量*/
    vector<int> value_;       /*商品價值*/
    int capacity_;            /*揹包容量*/
    int num_;                 /**/
    /* data */
public:
    knapsack(vector<int> &w, vector<int> &value, int cap, int num);
    int max_value(vector<vector<int>> &F);
};

knapsack::knapsack(vector<int> &w, vector<int> &v, int cap, int n) : weight_(w), value_(v)
{
    capacity_ = cap + 1;
    num_ = n + 1;
}

int knapsack::max_value(vector<vector<int>> &F)
{
    int i, j;
    for (i = 1; i < num_; i++)
    {
        for (j = 1; j < capacity_; j++)
        {
            if (weight_[i] > j) /*重量大於揹包容量了*/
                F[i][j] = F[i - 1][j];
            else
            {
                int value_take = F[i - 1][j - weight_[i]] + value_[i]; /*拿*/
                int value_not_take = F[i - 1][j];                      /*不拿*/
                F[i][j] = max(value_take, value_not_take);
            }
        }
    }
    return F[num_ - 1][capacity_ - 1];
}

int main(int argc, char const *argv[])
{
    int num, cap;
    cin >> num >> cap; /*輸入商品數量和揹包容量*/
    vector<int> weight = {
                    0,
                },
                value = {
                    0,
                };
    int temp;
    for (size_t i = 0; i < num; i++)
    {
        cin >> temp;
        weight.push_back(temp);
    }
    for (size_t j = 0; j < num; j++)
    {
        cin >> temp;
        value.push_back(temp);
    }
    vector<vector<int>> F(100,vector<int>(100)); /*100*100 表格*/

    knapsack hello(weight, value, cap, num);
    cout << hello.max_value(F) << endl;

    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章