• Poj 1014 Dividing(多重背包)


    一、题目大意

           有价值为1,2,3,4,5,6的六种大理石,它的数量不一。要在不破坏大理石的情况下,使两人能分到总价值相等的大理石。数量由标准输入给出,问给定数据能否平分。

    二、题解

           首先,我们要的是平分总价值为两份,这里有一个很明显的剪枝,即如果总价值为奇数则直接输出不可分。如果总价值为偶数,则要把它分为两份,也就是意味着我们要能从给定数量的大理石中选取若干使它的价值为总价值的一半,这样剩下的就是另一半了。这不就是多重背包嘛!

           对于多重背包,就是有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。本题求的是价值总和能否等于总价值的一半,如果等于则说明可以分。所以,我们的最大容量就是总价值的一半。还有本题的大理石只有数量和重量两种属性,其实先前提到的大理石的价值就可以看成是重量。这题的做法和之前做的题目是一样的做法,Poj 1742 Coins(多重背包)

           我还是要吐槽一下的,这个题目WA了四次,害的我总在找背包的原因,最后发现误会它了。是哪个该死的break的原因,在判断总价值奇数后就break了,应该是continue才对。这种小失误真是要命啊,要不是怎么说难题最多WA3次,水题就说不准了。

    三、java代码

    import java.util.Scanner;
    public class Main{
      public static void main(String args[]){
       int i, j, sum1, sum2;
       int n=0;
       int[] c=new int[7];  //记录大理石个数
       Scanner sc=new Scanner(System.in);
       while(sc.hasNext()){
    	  sum1=0;
    	  sum2=0;
    	  for(i=1;i<=6;i++){
    		c[i]=sc.nextInt();
    		sum2+=c[i]* i;
    		sum1+=c[i];
    	  }
    	  if(sum1==0)
    		  break;
    	  n++;
    	  if(sum2 % 2!=0){            //如果总价值为奇数则不可分
    		  System.out.println("Collection #"+n+":");
    	      System.out.println("Can't be divided.");
    	      System.out.println();
    	      continue;              //注意用continue
    	  }
    	  
          boolean dp[]=new boolean[sum2/2+1];
          dp[0]=true;
          for (i=1; i<=6; i++){
              if(c[i]!=0){
            	  int num[]=new int[sum2/2+1];
    	          for (j=i; j<=sum2 /2; j++){
    	             if (!dp[j] && dp[j-i] && num[j-i]< c[i]){
    	                   dp[j]=true;             
    	                   num[j]=num[j-i]+1;
    	              }
    	          }
              }
          }
          System.out.println("Collection #"+n+":");
          if(dp[sum2/2]){
        	  System.out.println("Can be divided.");
          }else
        	  System.out.println("Can't be divided.");
          System.out.println();  
       }
      } 
    }
    
    
    
    


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    sql server 查看某表时超长时间没有反应的解决方法
    FireDAC使用Mormot开发Rest服务器,返回JSON数据格式的问题
    SQL Server 检索死锁进程
    ABFramework升级,服务端或者是客户端打开出现
    sql server 清空数据,制作模板
    ABframework框架出现%1 不是有效的 Win32 应用程序。的解决方法
    MSSQL Sqlserver 使用ms未公开的存储过程重建全库表索引
    D处理转义符
    常用linux命令(一)
    docker实战教程(四):帮助启动类命令
  • 原文地址:https://www.cnblogs.com/AndyDai/p/4734133.html
Copyright © 2020-2023  润新知