博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu1059
阅读量:7116 次
发布时间:2019-06-28

本文共 1359 字,大约阅读时间需要 4 分钟。

题意:把价值为1,2,3,4,5,6的宝石平均分成两份,不能切割,有没有办法分开。

分析:多重背包。之前直接用01背包的方法做78ms,然后想试试用二进制优化,看看能跑多少。发现,用二进制反而变421ms。

#include 
int main(){ int marble[7],p = 1; bool knapsack[120000]; while(true) { int sum = 0; for(int i = 1;i <= 6;i++) { scanf("%d",&marble[i]); sum += i * marble[i]; } if(sum == 0) break; printf("Collection #%d:\n",p++); if(sum % 2 != 0) { printf("Can't be divided.\n\n"); continue; } sum /= 2; for(int i = sum;i > 0;i--) knapsack[i] = false; knapsack[0] = true; int aux[30],s; for(int i = 1;i <= 6;i++) { //二进制思想拆分物品 for(s = 0;(1 << s) <= marble[i];s++) { aux[s] = 1 << s; marble[i] -= aux[s]; } if(marble[i] != 0) aux[s++] = marble[i]; for(int j = 0;j < s;j++) { int temp = aux[j] * i; for(int k = sum;k >= temp;k--) knapsack[k] = knapsack[k - temp] || knapsack[k]; } } if(knapsack[sum]) printf("Can be divided.\n\n"); else printf("Can't be divided.\n\n"); }}

 

转载于:https://www.cnblogs.com/ZShogg/archive/2013/05/10/3070721.html

你可能感兴趣的文章
lisp 笔记 - 闭包
查看>>
NSCharacterSet(只保留textField中输入的数字)
查看>>
教程-经典Delphi教程网
查看>>
使用token机制来验证用户的安全性-b
查看>>
Spring Cloud Feign 出现ClassNotFoundException: feign.Feign$Builder错误
查看>>
Java AJAX开发系列 - 2,项目中使用ZK
查看>>
ORA-06508: PL/SQL: could not find program 'XXXX'
查看>>
C#的override、new、vitutal一例
查看>>
CentOS 5.5通过yum安装 Memcached的步骤、问题、及解决办法
查看>>
weblogic mime-type
查看>>
索引调优
查看>>
iphone开发中的数据存储:Core Data
查看>>
XCODE4.3.2编程-HelloWorld
查看>>
如何在存储过程中自动添加分区
查看>>
C++类的大小
查看>>
SQL Server逗号分隔字符串拆成临时表
查看>>
Android支持多种设备的方法及资源文件的使用
查看>>
[zz]va_start() 和 va_end()函数应用
查看>>
看不懂自己写的代码,这对一个职业程序员来说是不可饶恕的--完美可以因天赋而成,也可通过无情的重复和实验实现。因为我不具有前者,我就一直坚持着后者。...
查看>>
探讨.net Socket支持在线连接数量
查看>>