首页 > 其他分享 >0-1背背包问题

0-1背背包问题

时间:2023-06-11 18:22:34浏览次数:40  
标签:背包 int private 问题 set static 物品

0-1背包问题

参考链接:https://en.wikipedia.org/wiki/Knapsack_problem

/**
 * 0-1背包问题
 * 将n个价值为v,重量为v的物品放入限重为W的背包中,要求背包中物品的价值最高。
 * 
 */

import java.util.HashSet;
import java.util.Set;

public class Knapsack {

    //物品的价值,为使数组下标从1开始,在index 0 的位置填充-1.
    private static int[] v = { -1, 505, 352, 458, 220, 354, 414, 498, 545, 473, 543 };
    //物品的重量,为使数组下标从1开始,在index 0 的位置填充-1.
    private static int[] w = { -1, 23, 26, 20, 18, 32, 27, 29, 26, 30, 27 };
    //物品个数
    private static int n = 10;
    //限重
    private static int W = 67;
    //最终选用物品的集合
    private static Set<Integer> set = new HashSet<>();
    //数组m[i][w],表示对于前i个物品,在限重是w的情况下,的重大价值。
    //为使数组下标从1开始,+1.
    private static int[][] m = new int[n + 1][W + 1];

    public static void main(String[] args) {

        //选取前0件物品时的情况
        for (int j = 0; j <= W; j++) {
            m[0][j] = 0;
        }
        //限重为0时的情况
        for (int i = 1; i <= n; i++) {
            m[i][0] = 0;
        }

        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= W; j++) {
                //第i件物品的重量大于背包的承重,该物品不能被放入。
                //这时,m[i][j]等于放置前i-1个物品,限重为j时的最优解,既m[i-1][j].
                if (w[i] > j) {
                    m[i][j] = m[i - 1][j];
                //否则,该第i件物品有可能被放入背包中。具体情况为:
            } else {
                //假如没放物品i:
                m[i][j] = Math.max(m[i - 1][j], 
                //假设放入了物品i:
                m[i - 1][j - w[i]] + v[i]);
                }
            }
        }
        knapsack(n, W);
        System.out.println(set.toString());
    }

    public static Set<Integer> knapsack(int i, int j) {
        if (i == 0)
            return new HashSet<Integer>();
        if (m[i][j] > m[i - 1][j]) {
            set.add(i);
            //集合的交
            set.addAll(knapsack(i - 1, j - w[i]));
            return set;
        } else
            return knapsack(i - 1, j);
    }
}

标签:背包,int,private,问题,set,static,物品
From: https://www.cnblogs.com/funflux/p/17473335.html

相关文章

  • Django站点静态文件缓存相关问题
    《高性能网站建设指南》中有一条建议,为网站的页面、文件“添加Expires头”。这么做的好处就不多说了,实现方式也比较简单,不过,真的实施这条建议时,还是有许多问题需要考虑。通常情况下,我们需要将图片、js、css等不会经常更新的文件缓存起来,一般来说,配置服务器,为它们设置一个较远的......
  • Fabric不能启动后台进程问题
    在用Fabric启动远程后台进程时,由于自己的后台程序使用类似下面的方式后台运行,导致后台进程不能启动成功 javaMyServer&看了一下官方文档,说是有几种方式可以解决这个问题,下面是我使用的方法首先修改自己的启动后台进程的脚本 nohupjavaMyServer&>/dev/null&然后......
  • python中文乱码问题大总结
        在运行这样类似的代码:#!/usr/bin/envpythons="中文"prints最近经常遇到这样的问题:问题一:SyntaxError:Non-ASCIIcharacter'\xe4'infileE:\coding\python\Untitled6.pyonline3,butnoencodingdeclared;seehttp://www.python.org/peps/pep-0263.......
  • 算法题总结-分组背包
    原题有N件物品和一个容量为V的背包。第i件物品的费用是Ci,价值是Wi。这些物品被划分为K组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。由于截止目前,没有刷到对应的经典题目,以下以依赖背包的转化题......
  • Java8新特性Stream之list转map及问题解决
    List集合转Map,用到的是Stream中Collectors的toMap方法:Collectors.toMap具体用法实例如下://声明一个List集合Listlist=newArrayList();list.add(newPerson("1001","小A"));list.add(newPerson("1002","小B"));list.add(......
  • g4d/g4e反馈问题、提出建议须知
    为了便于g4d/g4e开发者更快地重现、定位问题,请大家反馈问题的时候,尽可能提供足够的相关信息,主要有:1、你所用的g4d/g4e的版本号是什么?2、你所用的g4d/g4e的主菜单是怎样的?3、使用过程中发现了什么问题,最好提供问题的截图,图文并茂,“一图胜千文”!4、你发现是从g4d/g4e的哪个版本......
  • 算法题总结-分组背包与依赖背包
    原题https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4?tpId=37&tqId=21239&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3Fdifficulty%3D1%26page%3D1%26pageSize%3D50%26search%3D%26tpId%3D37%26type%3D37&am......
  • hexo gitee搭建博客问题
    下载hexonpminstall-ghexo-cli出现Error:EPERM:operationnotpermitted错误删除C:\Users{你的用户文件夹}/目录中的.npmrc文件,一般为隐藏以管理员身份运行打开cmd下载依赖Error:EPERM:operationnotpermitted,open'D:\nodejs\soft\node_cache_cacache\tmp......
  • bcp...in...时,碰到问题:SQLState = S0002,NativeError = 208 错误
    1.直接在AdventureWorks2014中生成的脚本修改了下,生成一个表,2.然后将表中的数据导出成*.txtBCPAdventureWorks2013.Sales.SalesReasoninc:\tmp\SalesReason.txt-c-T3.再在一个数据库中testdb,建立一个表--在testdb中建议一个表SalesReason,将从AdventureWorks2014导......
  • Linux服务器配置SSH免密码登录后,登录仍提示输入密码(一次真实的问题排查解决记录)
    我们知道两台Linux服务器机器之间如果使用ssh命令登录或scp/rsync命令传输文件每一次都需要输入用户名相对应的密码,如果要免密码,则需要对两台Linux服务器机器之间进行SSH互信。一.SSH介绍1.SSH互信原理虽然这是废话,也希望大家了解一下。SSH(SecureShell)是一种安全的传输协议,它可以......