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入门到精通教程
查看: 330|回复: 0

[算法学习]背包问题的穷举解法

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

    [LV.1]初来乍到

    发表于 2014-10-30 23:59:29 | 显示全部楼层 |阅读模式
    背包问题
       

       

        问题描述:
          有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品的选择方案,使选中物品的总重量不超过指定的限制重量,但选中物品的价值之和最大(同样重量的铁和金子,你拿哪一个)。

         设n个物品的重量和价值分别存储于数组w[]和v[]中,限制重量为tw。考虑一个n个字符的字符串“1111...000001”,其中第i个字符0 表示第i个物品没有选取,而1则表示第i个物品被选取。显然每一个这样的字符串等价于一个选择方案。用穷举法解决背包问题,穷举所有的选取方案,就可以得到问题的解。
       

       

         下面是求解程序:
       

       

       

       
      
    public class  Test{
      public static void main(String args[]){
      int maxv=0; //价值最大值
      int tw=30;//背包限制重量

      int w[]={3,5,7,10,15,20,25,6,8,2};//物品的重量,假设有10个物品
      int v[]={10,6,5,8,4,6,12,3,2,1};//物品的价值
      
      String x="";//二进制字符串,对应一种选择方案
      String result="";//存放最佳解
      int b[]=new int[1024];//共有1024种选取物品的方案
      for (int i=0;i< 1024;i++) {
       b=i;
       x=Integer.toBinaryString(i);//把b转化为二进制字符串
       int temp_w=0;
       int temp_v=0;
       for (int k=0;k< x.length();k++){
        if (x.charAt(k)=="1"){
             temp_w=temp_w+w[k];
             temp_v=temp_v+v[k];
        }
       }
       
          if ((temp_w< =tw)&&(temp_v>maxv))
          {   
         
             maxv=temp_v;
             result=x;//保存该择选方案
          }
       }
      System.out.println("这个背包问题的最优解是:");
         
          System.out.print(result);
          System.out.println();
       
          System.out.println("价值最大值="+maxv);
          for(int k=0;k< result.length();k++){
             if(result.charAt(k)=="1")
                System.out.print(w[k]+"放入背包   ");
         }
       
    }
    }
    [/code] 程序运行结果:
    C:java>java Test
    这个背包问题的最优解是:
    1111000001
    价值最大值=30
    3放入背包 5放入背包 7放入背包 10放入背包 2放入背包
    C:java>
      

      
      
       
       

         
       

         
       
      

      

      










    源码下载:http://file.javaxxz.com/2014/10/30/235929218.zip
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-2-25 18:59 , Processed in 0.357316 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

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