博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ZOJ 2059 The Twin Towers
阅读量:6855 次
发布时间:2019-06-26

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

双塔DP。

dp[i][j]表示前i个物品,分成两堆(可以不全用),价值之差为j的时候,较小一堆的价值为dp[i][j]。

#include
#include
#include
#include
using namespace std;int dp[105][4000 + 10];int a[105];int n, sum;void read(){ for (int i = 1; i <= n; i++) scanf("%d", &a[i]);}void work(){ sum = 0; for (int i = 1; i <= n; i++) sum = sum + a[i]; memset(dp, -1, sizeof dp); int h; h = a[1]; dp[1][h + sum] = dp[1][0 - h + sum] = dp[1][sum] = 0; for (int i = 2; i <= n; i++) { h = a[i]; for (int j = 0; j <= sum*2; j++) dp[i][j] = dp[i - 1][j]; for (int j = 0; j <= sum*2; j++) { if (dp[i - 1][j] == -1) continue; int tmp = j - sum; if (tmp >= 0) { dp[i][h + tmp + sum] = max(dp[i][h + tmp + sum], dp[i - 1][j]); dp[i][tmp - h + sum] = max(dp[i][tmp - h + sum], dp[i - 1][j] + min(tmp, h)); } else if (tmp<0) { tmp = -tmp; dp[i][0 - (tmp + h) + sum] = max(dp[i][0 - (tmp + h) + sum], dp[i - 1][j]); dp[i][h - tmp + sum] = max(dp[i][h - tmp + sum], dp[i - 1][j] + min(tmp, h)); } } } int ans = 0; for (int i = 1; i <= n; i++) ans = max(ans, dp[i][sum]); if (ans == 0) printf("Sorry\n"); else printf("%d\n", ans);}int main(){ while (~scanf("%d", &n)) { read(); if (n < 0) break; if (n <=1) printf("Sorry\n"); else work(); } return 0;}

 

转载于:https://www.cnblogs.com/zufezzt/p/5259812.html

你可能感兴趣的文章
PhxPaxos源码分析——网络
查看>>
SharePoint Error - The SharePoint server was moved to a different location.
查看>>
十款绝bi好用的硬盘数据恢复软件值得拥有简易恢复
查看>>
写给设计师的字偶距调整指南
查看>>
三大优势加身,SDN成广域网优化重要手段
查看>>
苹果iOS 7开发者预览版被黑客成功越狱
查看>>
日常开发常用js日期方法
查看>>
IT气象预报台提醒:企业发展明日多“云”
查看>>
记录一下最近犯下的自以为是的错误
查看>>
云计算的春天:不需再为正版软件买单
查看>>
对象的共享(第三章)
查看>>
区块链能为现实世界的IT领域解决哪些问题?
查看>>
Windows 2016 TP5上的Docker初次体验
查看>>
一个有意思的给代码染色的类:CSyntaxColorizer
查看>>
工信部意外披露国内5G预定频段:3300MHz起
查看>>
Gmail宕机 备份问题成云计算新题
查看>>
NetBeans主题配色方案加设置
查看>>
一家中国互联网巨头从商业转技术的努力
查看>>
浅谈语音测试方案(一)
查看>>
存储的春天将来临?2017年存储行业收入将创纪录c
查看>>