c++(dp)背包

本文介绍了四种类型的背包问题:01背包、完全背包、多重背包和分组背包,详细阐述了解决这些背包问题的动态规划思路,包括状态定义、转移方程和初始化过程。并给出了每种类型背包问题的二维数组和滚动数组解决方案,同时包含拓展题目和解题思路。
摘要由CSDN通过智能技术生成

第一次写文章,轻喷,如有不足,欢迎指出 

背包种类:
1,01背包
2,完全背包
3,多重背包
4,分组背包
 


0,解dp背包题的大体思路
     确定状态——转移方程式——初始化

1,01背包
     给定n个物品,重量分别为w1、w2、w3...价值分别为p1、p2、p3...装入最大载重为m的背包,
要求一种物品只能装入一次,使装入的物品价值最大并且不超过背包的载重。


1)、确定状态

i/j 0 1 2 3
0
1
2
3

       表格的i表示前i个物品,j表示为背包最大载重为j,所以说表格中的元素为前i个物品最大载重为j时的最大价值。
        然后状态有两种,第1种为不选这个物品时的价值,第2种为选这种物品价值,再把两者比较大小就行。

2)、转移方程式
      

f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+p[i]);//w为物品的重量,p为物品的价值

       f[i-1][j]表示不选时的价值,同时也要继承前i-1物品的最大价值,f[i-1][j-w]+p表示选了这个物品,因为选了这个物品,所以要减去这个物品个重量(j-w),这样才装得下,然后加上物品的价值p就行。
 

3)、初始化
      前0个物品的最大价值为0。
 

 n物品数量
m背包最大载重
w每件物品的重量,p每件物品的价值 
--------------------01背包二维数组---------------------------
0-1背包-二维数组
 for(int i = 1; i <= n; i++)
   for(int j = 1; j <= m; j++)
      f[

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值