01背包问题(动态规划)

一.问题描述

有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大

 二.思路分析

根据动态规划五部曲进行分析

1)确定dp数组

使用二维dp数组dp[i][j]代表的含义是当背包容量是j时从物品0-i选取出价值最大组合

2)确定递推公式

1.背包容量j不够物品i放入        dp[i][j] = dp[i-1][j]

2.背包容量j足够物品i放入        dp[i][j] = max(dp[i-1][j],dp[i-1][j-weight[i]] + vaule[i])

3)dp数组初始化

1.i = 0时        当背包容量j < weight[0]初始化为0

                     当背包容量j > weight[0]初始化为value[0]

2.j= 0时        初始化为0 

4)确定遍历顺序

从上至下从左至右(对每个背包容量遍历一遍物品)

5)举例数组

 三.代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
using namespace std;
void test_2_wei_bag_problem1() 
{
    vector<int> weight = { 1, 3, 4 };
    vector<int> value = { 15, 20, 30 };
    int bagweight = 4;


    vector<vector<int>>dp(weight.size(),vector<int>(4+1,0));
    for(int j = weight[0];j <= bagweight;++j)
    {
        dp[0][j] = value[0];
    }
    for(int j = 1;j <= bagweight;++j)
    {
        for(int i = 1;i < weight.size();++i)
        {
            if(j < weight[i])
            {
                dp[i][j] = dp[i - 1][j];
            }
            else
            {
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
            }
        }
    }
    for(auto i : dp)
    {
        for(auto j : i)
        {
            cout << j<<" ";
        }
        cout << endl;
    }

    
}

int main() 
{
    test_2_wei_bag_problem1();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值