美文网首页
2018-08-08

2018-08-08

作者: Ping接未来 | 来源:发表于2018-08-08 23:53 被阅读0次

动态规划求0-1背包问题

问题描述

小偷发现了n个商品,第i个商品重量为wi,价值为vi。小偷希望尽量拿走价值高的商品,但是他的背包只能容纳W重的商品。求如何取舍这些商品? 由于对一个商品,要么被拿走要么不被拿走,所以被称为0-1背包问题。

求解思路

令m[i][j]表示第1个商品到第i个商品中,背包容量为j的情乱下,可获得的最大价值;
决定是否选择商品的方案,比较选与不选获得的价值大小,所以有递推式:
m[i][j]=max(m[i-1][j],m[i-1][j-w[i]+v[i]]) 当 j>=w[i]时
m[i][j]=m[i-1][j] 当 j<w[i]时

代码求解

import java.util.Scanner;
public class BagProblem {
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int[] value = new int[6];
        int[] weight = new int[6];
        value[0]=0;
        weight[0]=0;
        int i,j;
        String[] str1 = scan.nextLine().split(",");
        String[] str2 = scan.nextLine().split(",");     
        for(i=0;i<5;i++){
            value[i+1]=Integer.parseInt(str1[i]);   
        }
        for(j=0;j<5;j++){
            weight[j+1]=Integer.parseInt(str2[j]);      
        }
        int capacity = Integer.parseInt(scan.nextLine());
        int[][] m = new int[6][capacity+1];
        for(i=0;i<6;i++){
            for(j=0;j<=capacity;j++)
                m[i][j]=0;
        }
        for(i=1;i<=5;i++){
            for(j=1;j<=capacity;j++){
                if(weight[i]>j){
                    m[i][j]=m[i-1][j];
                }
                else{
                    m[i][j]=Math.max(m[i-1][j],m[i-1][j-weight[i]]+value[i]);
                }
            }
        }
        System.out.println(m[5][capacity]);
        traceback(5,weight,m,capacity);
        }
      public static void traceback(int n,int[]w,int[][]m,int c){
        int[] x = new int[n+1];
        for(int i=5;i>1;i--){
            if(m[i][c]==m[i-1][c])
                x[i]=0;
            else{
                x[i]=1;
                c-=w[i];
            }
        }
        x[1]=(m[1][c]>0)?1:0;
        for(int j=1;j<=n;j++)
            System.out.print(x[j]+" ");
    }
}

相关文章

  • 【随笔】2018-08-08据说,今天适合分手

    今日,2018-08-08; 据说,今天适合分手; 可是, 还没有恋爱; 怎么分手?

  • 感恩日记

    感恩日记 双小宝 2018-08-08 00:03 · 字数 870 · 阅读 0 · 日记本 2018.8.7 ...

  • 夏天

    竹山不爱吃山竹 2018-08-08 19:57 · 字数 2112 · 阅读 0 · 日记本 每年的夏天爸...

  • Android自动化测试

    记录 2018-08-08 该东西只是记录,方便你我他 UiDevice 此类介绍: 打开某个APP 工具介绍 u...

  • PRESS.one,你会用了吗

    [PRESSone拓荒者] 2018-08-08 以下为原作者正文。 PRESS.one的大名很多人都知道,...

  • 手把手教你使用PRESS.one

    [PRESSone拓荒者] 2018-08-08 编者按:不到半年时间,Press.one已经两次重大升级,...

  • 艺像标画画

    周三晚上6:45 周日晚上5:30 2018-08-08晚上6:45。画了一个小雨伞。 西瓜,树叶。

  • 《致良知——责善》

    时间:2018-08-08 君子理应规劝别人向善,这就是“责善”。责善的重点在于“忠告而善道之”,尽心劝诫...

  • 2018-08-08

    2018-08-08 事件:今天听群里分享,觉察自己有份自责。 感受:内疚,自责。 想法:我应该勇敢的去做,去担当...

  • sftp远程与本地文件传输

    writed at 2018-08-08 1.名词解释 ①SSH:是一个安全外壳协议, SSH理解:传统的网络服务...

网友评论

      本文标题:2018-08-08

      本文链接:https://www.haomeiwen.com/subject/pgmfbftx.html