Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 326|回复: 0

[算法学习]动态规划法求解0-1背包问题

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-6 00:03:26 | 显示全部楼层 |阅读模式
    用动态规划法求解0―1背包问题,并输出问题的最优解。
    0―1背包问题描述如下:
          给定m种物品和一背包。物品i的重量是w,其价值为v,背包的容量是c,问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大。(每种物品只能选择放入0/1次背包)  
    1. public class Knapsack
    2. {
    3.     public static void knapsack(int[] v, int[] w, int c, int[][] m)
    4.     {
    5.          
    6.         int n = v.length-1;

    7.         /** v[] w[] c 分别是价值、重量数组和背包容量,
    8.          m[i][j]表示只有w[i],w[i+1]...w[n]这些物品时,背包容量为j时的最大价值。*/
    9.       
    10.         int jMax = Math.min(w[n]-1, c);
    11.         for(int j = 0; j <= jMax; j++)  
    12.             m[n][j] = 0;        //当w[n]>j 有 m[n][j]=0
    13.         //m[n][j] 表示只有w[n]物品,背包的容量为j时的最大价值
    14.         for (int l = w[n]; l <= c; l++)
    15.             m[n][l] = v[n];  //当w[n]<=j 有m[n][j]=v[n]
    16.         //递规调用求出m[][]其它值,直到求出m[0][c]
    17.         for(int i = n-1; i >=1; i--)
    18.         {
    19.             jMax = Math.min(w[i]-1,c);            
    20.             for(int k = 0; k <=jMax; k++)
    21.                 m[i][k] = m[i+1][k];
    22.                      
    23.             for(int h = w[i]; h <= c; h++)
    24.                 m[i][h] = Math.max(m[i+1][h],m[i+1][h-w[i]]+v[i]);
    25.         }
    26.         m[0][c] = m[1][c];
    27.         if(c >= w[0])
    28.             m[0][c] = Math.max(m[0][c],m[1][c-w[0]]+v[0]);
    29.         System.out.println("bestw ="+m[0][c]);
    30.     }
    31.          
    32.     public static void traceback(int[][] m, int[] w, int c, int[] x)
    33.     {// 根据最优值求出最优解
    34.         int n = w.length-1;
    35.         for(int i = 0; i< n;i++)
    36.             if(m[i][c] == m[i+1][c])
    37.                 x[i] = 0;
    38.             else{
    39.                 x[i] = 1;
    40.                 c -= w[i];
    41.             }
    42.         x[n] = (m[n][c]>0)?1:0;
    43.     }
    44.     public static void main(String[] args)
    45.     {
    46.         //测试
    47.         int[] ww = {2,2,6,5,4};
    48.         int[] vv = {6,3,5,4,6};
    49.         int[][] mm = new int[11][11];
    50.         knapsack(vv,ww,10,mm);
    51.         int[] xx =new int[ww.length];
    52.         traceback(mm,ww,10,xx);
    53.         for(int i = 0;i< xx.length;i++)
    54.             System.out.println(xx[i]);
    55.     }
    56. }
    复制代码
    运行结果: C:java>java Knapsack
    bestw =15
    1
    1
    0
    0
    1
      

      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/11/6/000325843.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 10:16 , Processed in 0.478989 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表