当前位置: 首页 > 知识库问答 >
问题:

背包但精确重量

濮阳翔
2023-03-14

有没有一个算法来确定一个背包有一个准确的重量W?即。这类似于正常的0/1背包问题,其中有n个项目,每个项目的重量为w_i,值为v_i。最大化所有物品的价值,但是背包中物品的总重量需要精确的重量W!

我知道“普通的”0/1背包算法,但这也可以返回一个重量较小但价值较高的背包。我想找到最高值,但准确的W重量。

下面是我的0/1背包实现:

public class KnapSackTest {
    public static void main(String[] args) {
        int[] w = new int[] {4, 1, 5, 8, 3, 9, 2};  //weights
        int[] v = new int[] {2, 12, 8, 9, 3, 4, 3}; //values

        int n = w.length;
        int W = 15; // W (max weight)

        int[][] DP = new int[n+1][W+1];

        for(int i = 1; i < n+1; i++) {
            for(int j = 0; j < W+1; j++) {
                if(i == 0 || j == 0) {
                    DP[i][j] = 0;
                } else if (j - w[i-1] >= 0) {
                    DP[i][j] = Math.max(DP[i-1][j], DP[i-1][j - w[i-1]] + v[i-1]);
                } else {
                    DP[i][j] = DP[i-1][j];
                }
            }
        }
        System.out.println("Result: " + DP[n][W]);
    }
}
Result: 29

共有1个答案

林魁
2023-03-14

只需在最后一个els子句中设置dp[i][j]=-infinity,就可以实现这一目的。

其背后的IDE是稍微改变递归公式定义来计算:

  • 用精确的权重j到项i找到最大值。

现在,归纳法假设将发生变化,对正确性的证明将非常类似于规则背包,进行如下修改:

dp[i][j-weight[i]]现在是可以精确地用j-weight[i]构造的最大值,您可以取项i,给出dp[i][j-weight[i]]的值,也可以不取项,给出dp[i-1][j]-这是对第一个i-1项精确地使用weightj时的最大值。

请注意,如果由于某种原因无法构造dp[i][j],则永远不会使用它,因为在查找max时总是会丢弃值无穷大。

 类似资料:
  • 我应该如何尽可能有效地实现这个算法?贪婪的选择不起作用,所以我是否应该修改原始的动态编程解决方案来适应这个问题?如果是,怎么做? 如果有关系的话,我打算用Java写这个。

  • 在使用cssContainingText时,是否有任何方法可以搜索具有精确文本的元素。我使用下面的代码,但下拉列表中有多个值,如下所示。 下面是我正在使用的代码。

  • 导语听说铁汁萌想找入门级练手项目,那小编今天就给大家带来一个背景替换实战小项目。刚入门学习深度学习的小伙伴,可以看一看~将 BackgroundMattingV2 项目稍微魔改了一下,让他在可以选择单一图片的基础上,可以把抠好的图片贴在自定义的背景图上,这样就可以让照片中的人物,出现在任何背景上。是不是很有意思?想领取更多完整源码跟Python学习资料可点击这行字体哦项目说明项目结构我们先看一下项目的结构,如图:其中,model文件夹放的是模型文件,模型文件的下载地址为:

  • 可以在Jetpack Compose中进行权重吗?例如,我想以这样一种方式设置它,即一个项目被加权为布局的1/3,而另一个占剩余的2/3。 在XML/ViewGroup样式中,可以使用LinearLayouts和ConstraintLayouts来实现这一点。然而,令我沮丧的是,使用Jetpack Compose似乎是不可能的。 示例: 在ConstraintLayout中,这是按如下方式完成的:

  • 准备好,下面的内容会比较难以理解。 目前为止,我们已经使用map、nmap、vmap以及imap创建了实用的按键映射。 他们很方便,但是有个缺点。运行下面的命令: :::vim :nmap - dd :nmap \ - 试试按下\(在normal模式)。有什么现象? 当你按下\时,Vim会解释其为-。但是我们又映射了-!Vim会继续解析-为dd, 即它会删除整行。 你使用那些命令创建的映射可能会

  • 问题内容: 我在春季有以下几点 但是,Spring会自动为/ hello /和/hello.*添加映射。如何完全匹配网址? 只有/ hello应该可以工作,其他任何都应该404 问题答案: 关闭后缀匹配()将解决您的问题,但是,如果在您的配置中使用它(实际上不是手动连接所有必需的基础结构bean),实际上并不是那么容易。在这种情况下,定义其他类型的bean 不会有任何效果。 您有两种选择: 删除将