【动态规划】01背包问题 二维数组入门 详细讲解

问题简介

背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。相似问题经常出现在商业、组合数学,计算复杂性理论、密码学和应用数学等领域中。也可以将背包问题描述为决定性问题,即在总重量不超过W的前提下,总价值是否能达到V?它是在1978年由Merkle和Hellman提出的。

背包问题已经研究了一个多世纪,早期的作品可追溯到1897年数学家托比亚斯·丹齐格(Tobias Dantzig,1884-1956)的早期作品,并指的是包装你最有价值或有用的物品而不会超载你的行李的常见问题。

最常见的背包问题有01背包,完全背包,多重背包,分组背包这四种。01背包问题含义是N个物品,容量W的背包,每件物品仅用一次。

题目描述

题目来源:https://oj.czos.cn/p/1282

【动态规划】01背包问题 二维数组入门 详细讲解_第1张图片

做题思路

【动态规划】01背包问题 二维数组入门 详细讲解_第2张图片

正确代码

#include
using namespace std;
int c,n,w[110],v[110],dp[110][20023];
/*
    c : 背包容量
    n : 物品数量
    w[] : 每件物品的重量
    v[] : 每件物品的价值
    dp[物品数量][背包容量]  
*/

void solve(){
    
    //输入数据 
    cin>>c>>n;
    for(int i=1;i<=n;i++) cin>>w[i]>>v[i];
    
    //递推求出dp[][]
    for(int i=1;i<=n;i++){
        for(int j=1;j<=c;j++){
            if(w[i]<=j){
                //装得下
                int a=v[i]+dp[i-1][j-w[i]],b=dp[i-1][j];
                /*
                    a : 选
                    b : 不选
                */ 
                dp[i][j]=max(a,b);
            }else{
                //装不下
                dp[i][j]=dp[i-1][j]; 
            }
        }
    }
    
    //输出答案
    cout<>tc;
    while(tc--) solve();
    return 0;
}

【动态规划】01背包问题 二维数组入门

你可能感兴趣的:(动态规划,算法,c++,动态规划)