当前位置:网站首页 > 技术博客 > 正文

动态规划之01背包问题(最易理解的讲解)



1、什么是完全背包问题?

01背包问题:有一个背包的容积为V,有N个物品,每个物品的体积为v[i],权重为w[i],每个物品只能取1次放入背包中,背包所有物品权重和最大是多少?

完全背包 :有一个背包的容积为V,有N个物品,每个物品的体积为v[i],权重为w[i],每个物品可以取无限次放入背包中,背包所有物品权重和最大是多少?

01背包问题和完全背包问题的区别就在于,每个物品取的最大次数是1次还是无限次。

2、动态规划的状态和转移方程

参考01背包的状态和转移方程,来推导完全背包的状态和转移方程。

 
大家可以留出5秒钟的时间来思考…
 

恭喜你,完全背包问题已经被你攻克了,下面来看一下代码吧。

3、代码

练习题:完全背包问题

 

程序:

 

代码优化

优化点:

黄金级:
1)if (v[i] > j) 可以优化到 for (int j = 1; j <= m; j ++ ) 中,优化后为:

 

2)w[] 和 v[]可以优化掉。代码中的v和w数组使用仅限于i状态下,因此,可以定义两个变量,v和w,在for (int i = 1; i <= n; i ++ )中输入即可,优化后:
for (int i = 1; i <= n; i ++ ) {
int v, w;
scanf("%d %d", &v, &w);
}

铂金级
二维数组f可以优化成一维的f,具体优化可以参考这篇文章,这里不过多介绍。

王者级:
从状态转移方程下手:f[i][j] = max(f[i-1][j- k * v[i]]+ k * w[i] (k= 0, 1, 2, 3, 4,…))
方程拆开:

 

使用代入法,将j= j-v[i]带入上面的方程中得到:

 

对比第二个和第一个方程,我们发现,方程1可以简化成:

 

怎么看起来跟01背包模型的好像啊,我们对比一下:

 

好了,上最终的代码了:

 

16行代码解决该问题,如果有疑问或者不懂的地方欢迎评论区留言。

版权声明


相关文章:

  • java自己写一个注解2025-05-05 16:30:04
  • qss语法2025-05-05 16:30:04
  • linux将gbk转为utf82025-05-05 16:30:04
  • linux中getpid2025-05-05 16:30:04
  • 开窗函数语法结构2025-05-05 16:30:04
  • 程序员快速入门2025-05-05 16:30:04
  • epic安装不上错误代码25032025-05-05 16:30:04
  • clientwidth和offsetwidth2025-05-05 16:30:04
  • 攻防世界easyrsa2025-05-05 16:30:04
  • 生成树概念2025-05-05 16:30:04