• 背包问题---怎么选取物品,可以使得背包装的物品价值最大?


    原文:

    https://zhuanlan.zhihu.com/p/567560364

    1)0-1背包问题的描述

    现在有四种物品,每种物品只有1件,它们的重量与价值如下表。

    现在有一个背包,总容量为8。问怎么选取物品,可以使得背包装的物品价值最大?

    物品编号物品重量物品价值物品数量
    1231
    2341
    3451
    4581

    (2)多重背包问题的描述

    现在有四种物品,每种物品有若干件,它们的重量与价值如下表。

    现在有一个背包,总容量为8。问怎么选取物品,可以使得背包装的物品价值最大?

    物品编号物品重量物品价值物品数量
    1232
    2342
    3452
    4582

    (3)完全背包问题的描述

    现在有四种物品,每种物品有无数件,它们的重量与价值如下表。

    现在有一个背包,总容量为8。问怎么选取物品,可以使得背包装的物品价值最大?

    物品编号物品重量物品价值物品数量
    123无数件
    234无数件
    345无数件
    458无数件

    一、0-1背包问题

    一、0-1背包问题

    思路:对于每件物品,由于是不可分割的放入,所以,就有两种情况:该物品放入背包与该物品不放入背包;为了将以上问题求解出来,我们需要设置好状态以及状态转移方程。

    (1)定义状态

    DP[k][w]:表示当背包剩余容量为w,现在有前k件物品可放的情况下,背包所能装物品的最大价值。

    那么,状态确定好了,上面所描述的题目中,只要求出DP[4][8]就可以了。

    DP[k][w]怎么求呢,这就是状态转移方程的问题。

    (2)状态转移方程

    我们先将状态转移方程写出来吧,就是:

    DP[k][w] 等于下列两种情况:

    ①DP[k][w]=DP[k-1][w],当第k件物品的重量大于w时

    ②DP[k][w]=max(DP[k-1][w],DP[k-1][w-wi]),当第k件物品的重量不大于w时

    1. #include <stdio.h>
    2. #define N 10010
    3. #define V 10010
    4. #define MAX(a,b) ((a) > (b) ? (a) : (b))
    5. int dp[N][V];
    6. int n, v; //n:物品数量,v:背包实际容量
    7. int weight[N]; //第n件物品的重量
    8. int value[N]; //第n件物品的价值
    9. void knap_01()
    10. {
    11. for (int i = 1;i <= n; i++)
    12. for (int j = 1; j <= v; j++) {
    13. if (weight[i] > j) {
    14. dp[i][j] = dp[i-1][j];
    15. } else {
    16. dp[i][j] = MAX(dp[i - 1][j - weight[i]] + value[i], dp[i - 1][j]);
    17. }
    18. }
    19. }
    20. int main()
    21. {
    22. scanf("%d %d", &n, &v);
    23. for(int i = 1;i <= n; i++) {
    24. scanf("%d", &weight[i]);
    25. }
    26. for(int i = 1;i <= n; i++) {
    27. scanf("%d", &value[i]);
    28. }
    29. knap_01();
    30. printf("dp[%d][%d]=%d\n", n, v, dp[n][v]);
    31. return 0;
    32. }

  • 相关阅读:
    【从头构筑C#知识体系】2.1 泛型
    2.2 常量
    MyBatis-Plus 笔记(二)
    NOSQL Redis十大数据类型
    设计模式之抽象工厂模式--创建一系列相关对象的艺术(简单工厂、工厂方法、到抽象工厂的进化过程,类图NS图)
    LeetCode 834. 树中距离之和 手绘版
    【RPC】RPC的序列化方式
    软件开发、网络空间安全、人工智能三个方向的就业和前景怎么样?哪个方向更值得学习?
    Android Studio 截屏
    文件服务器审核
  • 原文地址:https://blog.csdn.net/weixin_41010318/article/details/132873263