poj1014(较复杂的背包问题)

来源:互联网 发布:c语言画玫瑰花程序 编辑:程序博客网 时间:2024/05/29 04:35

题目:http://poj.org/problem?id=1014

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.util.StringTokenizer;class Reader{static BufferedReader reader;static StringTokenizer tokenizer;static void init(InputStream input) {reader=new BufferedReader(new InputStreamReader(input));tokenizer=new StringTokenizer("");}static String next() throws IOException{while (!tokenizer.hasMoreTokens()) {tokenizer=new StringTokenizer(reader.readLine());}return tokenizer.nextToken();}static int nextInt() throws IOException{return Integer.parseInt(next());}}public class Main {/** * @param args */static int arr[],cnt[];static boolean flag;static boolean bo[];static int casenum,sum;private static boolean isOK() {flag=true;for (int i=1;i<=6;i++)if (arr[i]!=0)flag=false;return flag;}private static boolean deal() {sum=0;for (int i=1;i<=6;i++)sum+=i*arr[i];if (sum%2==1) return false;sum=sum/2;bo=new boolean[sum+1];cnt=new int[sum+1];bo[0]=true;for (int i=1;i<=6;i++){for (int j=0;j<=sum;j++) cnt[j]=0;for (int j=i;j<=sum;j++)if (bo[j-i]&&(!bo[j])&&(cnt[j-i]<arr[i])) {cnt[j]=cnt[j-i]+1;bo[j]=true;}}return bo[sum];}public static void main(String[] args) throws IOException {// TODO Auto-generated method stub      Reader.init(System.in);      arr=new int[7];      for (int i=1;i<=6;i++)      arr[i]=Reader.nextInt();      casenum=0;      while (!isOK()) {      casenum++;      System.out.println("Collection #"+casenum+":");      if (deal()) System.out.println("Can be divided.");      else System.out.println("Can't be divided.");      System.out.println();      for (int i=1;i<=6;i++)          arr[i]=Reader.nextInt();      }}}

题目意思差不多就是给你价值为1~6的marbles的数目,问你是否能采取方案使得最终价值能够给两人平分

思路:首先当然是先求价值和,如果价值和为奇数自然就gg啦~~~。之后呢,用个布尔数组和一个计数数组,

然后循环过去不断更新,前者用来表示某个价值能取到与否,后者表示对于某个价值,当前价值i的marbles至少

取到多少个。最后,就是看总价值/2这个价值能否取到。其中最关键的就是下面这个语段了,含义应该比较清楚

      if (bo[j-i]&&(!bo[j])&&(cnt[j-i]<arr[i])) {      cnt[j]=cnt[j-i]+1;      bo[j]=true;      }
         



0 0
原创粉丝点击