我该如何解决? KnapSack - 值完全相同,但每个对象都有三个权重

2024-05-30

我在解决我的练习时遇到问题。我读到了动态规划和算法,我认为我的练习是“特定背包问题”。我用暴力法解决了它,但我无法用动态规划解决它。

我有一艘重300吨的船(背包)。有些晶体本身含有 3 种物质(X、Y、Z) - 每种物质都有重量,并且所有晶体都具有相同的值。我需要包装运输尽可能多的晶体,但所有包装晶体的物质比例必须是1:1:1。但例如,如果我有 3 个比例为 1:1:1 的晶体,给出了最大的吨数,而 8 个晶体给出了相同的吨数(另外两个晶体组合给出了最大的吨数),我需要选择具有最少晶体数量的组合。

我用蛮力方法解决了它 - 我创建了所有组合的数组列表。接下来我发现它们以1:1:1的比例组合。接下来,我找到了提供最大吨数且晶体数量最少的组合(如果有两个或多个组合具有相同的最大吨数)。我检查了测试,结果显示成绩不错, 我不知道如何用动态编程来解决它;/有人可以帮助我吗?

例如,当我有 10 个水晶时:

 1) X =2 Y =3 Z =4
 2) X =5 Y=10 Z =2
 3) X =3 Y =3 Z =3
 4) X =1 Y =0 Z =6
 5) X =9 Y=12 Z =4
 6) X =1 Y =1 Z =1
 7) X =2 Y =1 Z=0
 8) X =1 Y =2 Z =3
 9) X =1 Y =1 Z =1
10) X =4 Y =3 Z =3

解决方案是:最多 27 吨,五个水晶(数字:1、3、6、7 和 9)


互联网上有一些很好的教程,可以彻底解释背包问题。

更具体地说,我会推荐这个具体的 http://www.geeksforgeeks.org/dynamic-programming-set-10-0-1-knapsack-problem/,其中完全解释了问题和 DP 方法,包括三种不同语言(包括 Java)的解决方案。

// A Dynamic Programming based solution for 0-1 Knapsack problem
class Knapsack
{
    // A utility function that returns maximum of two integers
    static int max(int a, int b) { return (a > b)? a : b; }

   // Returns the maximum value that can be put in a knapsack of capacity W
    static int knapSack(int W, int wt[], int val[], int n)
    {
         int i, w;
     int K[][] = new int[n+1][W+1];

     // Build table K[][] in bottom up manner
     for (i = 0; i <= n; i++)
     {
         for (w = 0; w <= W; w++)
         {
             if (i==0 || w==0)
                  K[i][w] = 0;
             else if (wt[i-1] <= w)
                   K[i][w] = max(val[i-1] + K[i-1][w-wt[i-1]],  K[i-1][w]);
             else
                   K[i][w] = K[i-1][w];
         }
      }

      return K[n][W];
    }

    // Driver program to test above function
    public static void main(String args[])
    {
        int val[] = new int[]{60, 100, 120};
        int wt[] = new int[]{10, 20, 30};
        int  W = 50;
        int n = val.length;
        System.out.println(knapSack(W, wt, val, n));
    }
}
/*This code is contributed by Rajat Mishra */

Source: 极客之极客 http://www.geeksforgeeks.org/dynamic-programming-set-10-0-1-knapsack-problem/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我该如何解决? KnapSack - 值完全相同,但每个对象都有三个权重 的相关文章

随机推荐

  • Brainfuck Hello World 实际上是如何工作的?

    有人把这个发给我 并声称这是 Brainfuck 中的一个你好世界 我希望如此 gt gt gt gt lt lt lt lt gt gt gt lt lt gt gt gt 我知道它通过移动指针以及递增和递减内容来工作的基础知识 但我还是
  • Swift 中使用 T 型进行泛型调用

    在我的应用程序中 我想创建一个通用方法 该方法根据给定类型 T 创建一个对象数组 我创建了以下函数 func getArray
  • mysql_fetch_array while 循环。它是如何工作的?

    我已经阅读了 php net 上的该函数 但这仍然没有回答我的问题 我对 C 语言有一定的了解 并且刚刚开始使用 php 通常在 C 中 如果要执行 while 循环 则需要有一些条件来将循环推进到不再有效的点 如下所示 while x g
  • 如何使用 git 撤消所有空白更改

    我有一个 git 存储库 我在其中本地替换了很多文件 git status 现在显示许多修改的文件 有些是 真正修改过的 其他的只是行结尾不同 我希望那些仅通过行结尾不同的内容消失 git重置它们 但是 我似乎找不到 linux pipin
  • 无法创建变体“android-manifest-metadata”

    我在 Playstore 上上传了我的应用程序 bundle aab 方法 它在 android 6 0 上运行正常 没有错误 但在 android 7 0 设备上出现错误 并且无法运行该应用程序 我使用了 Gradle 构建类路径 3 1
  • 命名空间、类和自由函数 - 什么时候需要完全限定名称

    在下面的示例中 为什么我必须完全限定 cpp 中自由函数的名称以避免链接器错误 以及为什么它适用于没有链接器错误的类函数 你能解释一下其中的区别吗 ctest h int FreeFunction void 只是一个声明 而下面是一个定义
  • Apache Spark 和 scikit_learn 之间的 KMeans 结果不一致

    我正在使用 PySpark 对数据集执行聚类 为了找到簇的数量 我对一系列值 2 20 进行了聚类 并找到了wsse 簇内平方和 每个值的值k 在这里我发现了一些不寻常的东西 根据我的理解 当你增加集群数量时 wsse单调递减 但我得到的结
  • Cordova SQLite 保存 BLOB

    我的 Cordova SQLite 插件有问题 如何将 BLOB 图像保存到 SQLite 我在 JS 中有 BLOB 对象 Blob size 96874 type image jpeg proto Blob length 1 我试图拯救
  • 刷新页面后保留输入值

    我有一个带有输入字段的表单 该输入包含一个下拉菜单 从数据库中读取信息 如果用户输入值 并且当他到达下拉菜单时 他没有找到他想要的内容 他会转到另一个页面将此信息添加到下拉菜单 然后转到第一页继续输入信息 如果他转到另一个页面向下拉菜单添加
  • terraform local-exec 用于执行 mysql 脚本的命令

    我创建了 aws db instance 以使用 Terraform 配置配置 RDS MySQL 数据库 我需要在 RDS 上执行 SQL 脚本 CREATE TABLE 和 INSERT 语句 我不知道在这里使用什么命令 有人有我的用例
  • boost.log std::exception 格式化程序无法在自己的命名空间中找到运算符 << 重载

    我为 boost log 创建了一个简单的格式化程序 如下所示this http www boost org doc libs 1 59 0 libs log doc html log extension settings html例如st
  • Dpkg:警告:包“x”的文件列表文件丢失;假设 Ubuntu 16.04 中当前没有安装包

    我使用 Ubuntu 16 04 和 lubunut 桌面环境 当我这样做时 我遇到了以下问题超过3天apt get upgrade 我不知道问题是什么以及如何解决 注意 3天前我尝试升级Linux header 4 4 66 但显示错误
  • App_Web_XXX.dll 中发生 System.NullReference 异常 - 部分视图中出现错误

    当登陆我的 MVC 页面之一时 我收到此错误 dll 名称中包含随机字符串 类型的第一次机会异常系统 NullReferenceException发生在 App Web cjmhrrqn dll 中 附加信息 未将对象引用设置为对象的实例
  • 消除多个 Elseif 语句

    我试图保持我的代码干净 特别是在用户表单中使用组合框 可能会有很多 if Elseif 语句 应该有一种更简单的方法 让一个组合框不再需要多页代码 是吗 现在如何完成的示例 Sub Example Dim Variable as Strin
  • R:行数不相等的列绑定

    我有两个数据集 它们每个都有变量 ID Block 和 RT 反应时间 我想合并 列绑定这两个集合 以便我拥有一个包含变量的数据集 ID 块 RT1 RT2 问题是两个集合中的行数不相等 此外 ID 和块号匹配也很重要 缺失值应替换为 NA
  • docker 主机 (OSX) 上的关闭端口在内部 docker 网络上保持/报告打开状态

    在 OSX 12 3 上将 Docker 升级到 4 6 0 后 当我停止 PHPStorm 中的 xdebug 监听客户端时 我遇到了一些奇怪的问题 似乎后续请求总是超时 因为 docker 报告 host docker internal
  • 在 Java 8 中将对象追加到列表并返回结果?

    有没有一种方法可以将对象附加到列表并以功能性非命令方式在一行中返回结果 如果原始列表也不应该被改变 你会怎么做 Java 8 是允许的 我已经知道如何将两个列表连接到一行中 Source https stackoverflow com a
  • Junit Mockito 测试一切

    我现在正在寻找更多时间但没有结果 请帮忙 这是我要测试的课程 public class DBSelectSchema extends Database private static final Logger LOG Logger getLo
  • Javascript - 使数组索引 toLowerCase() 不起作用

    我试图将所有数组索引设置为小写字符串 但它不起作用 我在这里查看了其他答案并尝试了他们的解决方案 例如使用toString 添加之前toLowerCase但它不起作用 这很奇怪 我创建了一个问题的jsfiddlehere https jsf
  • 我该如何解决? KnapSack - 值完全相同,但每个对象都有三个权重

    我在解决我的练习时遇到问题 我读到了动态规划和算法 我认为我的练习是 特定背包问题 我用暴力法解决了它 但我无法用动态规划解决它 我有一艘重300吨的船 背包 有些晶体本身含有 3 种物质 X Y Z 每种物质都有重量 并且所有晶体都具有相