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


    原文:

    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. }

  • 相关阅读:
    固态硬盘开盘数据恢复的方法
    Leetcode 2458. 移除子树后的二叉树高度
    Python新手常犯的8个错误,你中招了吗?
    Vue 框架基础 -router导航守卫
    英语CN专刊《英语教师》简介及投稿须知
    docker--redis容器部署及地理空间API的使用示例-II
    Python21day学习---numpy生成数组的若干方法----day19
    Apache httpd 安全漏洞处理-升级httpd版本
    NVIDIA CUDA Toolkit
    Flutter层对于Android 13存储权限的适配问题
  • 原文地址:https://blog.csdn.net/weixin_41010318/article/details/132873263