博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDOJ 1059 DP背包
阅读量:6862 次
发布时间:2019-06-26

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

以前做过类似的题目,所以很快就有思路了。

首先判断marbles的总价值是否是偶数,如果不是的话,显然不能对半分。如果总价值是偶数,则变成背包问题,判断是否有marbles的组合的价值为总价值的一半。

第一次试,循环的上下界设的比较宽,超时了。然后想了一下,觉得可以做一些限制,把这些限制加了以后,就过了。

#include 
using namespace std;const int MAX_MARBLE = 20005;int ans[MAX_MARBLE * 6];/* marbles可能达到的最大价值是MAX_MARBLE * 6 */void readMarbles(int marbles[]){ for (int i = 1;i <= 6;i ++) scanf("%d",&marbles[i]);}int isExit(int marbles[]){ readMarbles(marbles); int isAllZero = 1; for (int i = 1;i <= 6;i ++) { if (marbles[i] != 0) { isAllZero = 0; break; } } return isAllZero;}int getTotal(int marbles[])/* 计算所有marbles之和 */{ int total = 0; for (int i = 1;i <= 6;i ++) total += marbles[i] * i; return total;}int main (){ int marbles[7]; int caseNum = 1; while (isExit(marbles) == 0)/* 读并判断是否结束 */ { printf("Collection #%d:\n",caseNum); caseNum ++; int total = getTotal(marbles); if (total % 2 != 0)/* 如果所有marbles之和不是偶数,肯定不能分成两半 */ { printf("Can't be divided.\n\n"); continue; } memset(ans,0,sizeof(ans)); ans[0] = 1; int maxPos = 0,lowerBound,upperBound; for (int i = 1;i <=6;i ++) { for (int k = 1;k <= marbles[i];k ++) { upperBound = (maxPos + i) < (total / 2) ? (maxPos + i) : (total / 2); if (k == 1)/* 第一次,从i开始查找 */ lowerBound = i; for (int j = upperBound;j >= lowerBound;j --) { if (ans[j - i] == 1) { ans[j] = 1; maxPos = maxPos > j ? maxPos : j;/* maxPos记录当前找到的marbles的最大价值 */ } } lowerBound = upperBound;/* upperBound以前的有效值都被找过了,下一次查找从upperBound开始 */ } if (ans[total / 2] == 1)/* 已经找到答案,提前结束 */ break; } if (ans[total / 2] == 1) printf("Can be divided.\n\n"); else printf("Can't be divided.\n\n"); } return 0;}

转载于:https://www.cnblogs.com/peaceful-andy/archive/2012/08/10/2633019.html

你可能感兴趣的文章
Android -- 真正的 高仿微信 打开网页的进度条效果
查看>>
ArrayList<HashMap<String, Object>>使用示例!
查看>>
Windows Azure 网站开发Stacks支持
查看>>
Android 5.0新控件——FloatingActionButton(悬浮按钮)
查看>>
每天一个linux命令(6):dos2unix unix2dos
查看>>
ObjectQuery查询及方法
查看>>
使用jemeter手工编写注册、登陆脚本 运用 fiddler (三)
查看>>
uva 10288 Coupons (分数模板)
查看>>
使用docker的kms服务器激活office2016专业增强版
查看>>
Redis
查看>>
程序员需要淡定
查看>>
大整数算法[11] Karatsuba乘法
查看>>
为什么可以用while(cin)?
查看>>
Cisco 交换机与路由器故障处理方法分享
查看>>
linux运行级别
查看>>
Debian(Linux)+XAMPP(LAMPP)+Zend Studio + PHP +XDebug 完整的开发环境配置方法。
查看>>
Python字符集编码和文件读写 [转]
查看>>
COGS728. [网络流24题] 最小路径覆盖问题
查看>>
Python----切片
查看>>
处理浏览器兼容性(持续更新)
查看>>