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
- poj1014(较复杂的背包问题)
- POJ1014 多重背包问题
- 如何应对较复杂的轨迹问题?
- poj1014 Dividing 动态规划 多重背包问题
- ZOJ1149 POJ1014 HDU1059 Dividing,多重背包问题
- POJ1014:Dividing<动归,背包问题>
- poj1014 Dividing(多重背包的二进制优化)
- 制作较复杂的电路板
- maven - 较复杂的实例
- 较复杂的sql语句
- POJ1014 - 多重背包
- poj1014 多重背包
- POJ1014--多重背包--Dividing
- 多重背包--poj1014
- poj1014 多重背包
- poj1014 Dividing(背包)
- poj1014 多重背包
- poj1014多重背包
- 精讲WEB前端之Flex弹性盒模型属性,对比每一属性值和效果
- jQuery动画
- 1、MAC常用工具汇总一
- js实现的下拉框二级联动效果
- 定义一个不能被继承的类
- poj1014(较复杂的背包问题)
- 抽象类 接口 的个人理解
- C语言学习历程——编程练习2——03
- Java JDBC连接SQL Server2005错误:通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败
- Ajax、JSON
- 2017.04.30 有关c语言的可变参数表的学习
- 如何用polyfill制作响应式图片轮播
- OKHttp原码分析(一)
- 如何设计一个优秀的数据库