【算法小记】DP 之 0-1背包问题

0-1背包(ZeroOnePack): 有N件物品和一个容量为C的背包。(每种物品均只有一件)第i件物品的重量是W[i],价值是V[i]。求解将哪些物品装入背包可使价值总和最大。

特点:每种物品仅有一件,可以选择放或不放。物品重量总和小于或等于背包容量。

 *一开始,可以使用暴力方法,遍历所有可能性,再选出符合条件的可能,然后比较找出价值最大的。

运用DP思想解决子问题


设m[ i ] [ j ] :背包容量为j,可选择物品为第 i 到 n 个时的最优值问题分析

分析两种情况:1. 第i个物品放不进去背包:W[ i ] > j;

                            2.可以放进去,但是可以选择放进去或者不放:W[ i ] =< j;

                                            1   2  3  4

                                  V[]     8  7  4  16

                                W[]      4  2  3   8

 列:第i个到第n个物品;

行:背包容量

 012345678910
10000888+78+7,8+48+7,8+4,1616,8+4+78+4+7,16+7
2007777,7+4     
3000444,4+74+7,8+78+7,8+48+7,168+7+4,168+7+4,7+16
4000000000016
#include <iostream>
 
using namespace std;
 
int w[105], val[105];
int dp[105][1005];
 
int main()
{
    int t, m, res=-1;
    cin >> t >> m;//t:背包容量;m:物品总数 
    for(int i=1; i<=m; i++)
        cin >> w[i] >> val[i];
    
    for(int i=1; i<=m; i++) //物品 
        for(int j=t; j>=0; j--) //容量 
        {
            if(j >= w[i])
                dp[i][j] = max(dp[i-1][j-w[i]]+val[i], dp[i-1][j]);
            else     
                dp[i][j] = dp[i-1][j];           
        }
    cout << dp[m][t] << endl;
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值