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

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

题目大意:就是有价值1、2、3、4、5、6的硬币各多少个,然后让你判断能否把他们分成价值相等的两部分。

        题目思路:目测dp,一看果然dp,完全背包,需要剪枝,硬币个数为容量,下标为value,用一个bool数组就可以标记是否有方案能构成当前下标的money。最后判断数组中下标为sum/2的值是否为为true即可。

#include 
#include
#include
using namespace std;bool flag[120005];int main(){ int a[7]; int i,j,k,cnt = 0; while(scanf("%d%d%d%d%d%d",a+1,a+2,a+3,a+4,a+5,a+6)) { if(a[1]==0 && a[1]==a[2] && a[2]==a[3] && a[3]==a[4] && a[4]==a[5] && a[5]==a[6]) break; cnt++; memset(flag, 0, sizeof(flag)); int sum = a[1]+a[2]*2+a[3]*3+a[4]*4+a[5]*5+a[6]*6; if(sum%2 == 1) { printf("Collection #%d:\nCan't be divided.\n\n",cnt); continue; } flag[0]=true; int maxn = 0; for(i=1;i<=6;++i) { for(j=maxn; j>=0; --j) { if(flag[j]) { for(k=1; k<=a[i] && j+k*i <= sum/2; ++k) { if(flag[j+k*i]) break; flag[j+k*i] = true; } } } maxn += a[i]*i; } if(flag[sum/2]) printf("Collection #%d:\nCan be divided.\n\n",cnt); else printf("Collection #%d:\nCan't be divided.\n\n",cnt); }}

 

转载于:https://www.cnblogs.com/mltang/p/8799253.html

你可能感兴趣的文章
Linux-HA开源软件Heartbeat(配置篇)
查看>>
Citrix 桌面及应用虚拟化系列之一:XenServer安装
查看>>
解决Ubuntu解压乱码
查看>>
AJAX 异步(JavaScript 和 XMLHTTP)
查看>>
Atom 备份神器 —— Sync Settings
查看>>
Java8-Synchronized-No.02
查看>>
Windows 8实用窍门系列:17.文件选择器 文件保存器 文件夹选择器
查看>>
AE92 SDK for Java 最小示例学习
查看>>
Linux 中 Nginx 重启关闭
查看>>
Oracle 免费的数据库--Database 快捷版 11g 安装使用与"SOD框架"对Oracle的CodeFirst支持...
查看>>
Hadoop MapReduce编程 API入门系列之挖掘气象数据版本3(九)
查看>>
Linux命令大全
查看>>
[Eclipse插件] Eclipse中如何安装和使用GrepCode插件
查看>>
前台取json对象中的数据
查看>>
ArcGIS Flex API 中的 Flex 技术(二)--面向对象
查看>>
Ext.Net学习笔记07:Ext.Net DirectMethods用法详解
查看>>
C#进阶系列——WebApi 接口测试工具:WebApiTestClient
查看>>
VBS变量名和标识符的介绍(转)
查看>>
iOS:iOS开发系列–打造自己的“美图秀秀”(下)
查看>>
Linux虚拟地址空间布局以及进程栈和线程栈总结【转】
查看>>