博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[USACO 2012 Jan Silver] Bale Share【DP】
阅读量:5304 次
发布时间:2019-06-14

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

传送门:http://www.usaco.org/index.php?page=viewproblem2&cpid=107

没想到太不应该了,真的不应该啊!

f[i][j][k]表示前i个包,第一个包里共有j大小的物品,第二个包里共有k大小的物品是否成立,则方程为:

f[i][j][k] = f[i - 1][j - a[i]][k] || f[i - 1][j][k - a[i]] || f[i - 1][j][k];

观察方程,可以省去数组a改用单独一个变量,并使用滚动数组,详见代码。

#include 
const int maxn = 21;int n, a, s, ans = 2147483647;bool f[2005][2005];inline int minn(int aa, int ss) { return aa < ss? aa: ss;}inline int max3(int aa, int ss, int dd) { aa = aa > dd? aa: dd; return aa > ss? aa: ss;}int main(void) { freopen("baleshare.in", "r", stdin); freopen("baleshare.out", "w", stdout); scanf("%d", &n); f[0][0] = true; for (int i = 1; i <= n; ++i) { scanf("%d", &a); s += a; for (int j = s; j >= 0; --j) { for (int k = s - j; k >= 0; --k) { if (j >= a) { f[j][k] = f[j][k] || f[j - a][k]; } if (k >= a) { f[j][k] = f[j][k] || f[j][k - a]; } } } } for (int j = 0; j <= s; ++j) { for (int k = 0; j + k <= s; ++k) { if (f[j][k]) { ans = minn(ans, max3(j, k, s - j - k)); } } } printf("%d\n", ans); return 0;}

为什么会变成这样呢,明明是一道水题。。。

转载于:https://www.cnblogs.com/ciao-sora/p/5958011.html

你可能感兴趣的文章
Qt图片显示效率的比较(转)
查看>>
VMware中CentOS设置静态IP
查看>>
剑指Offer_编程题_7
查看>>
js 变量大小写
查看>>
Linux系统的启动原理
查看>>
JDesktopPane JInternalFrames
查看>>
错误The request sent by the client was syntactically incorrect ()的解决
查看>>
Java基础知识学习(九)
查看>>
redis在windows下总是报错,就是下面的错误,这是哪里出错了
查看>>
Asp.net窄屏页面 手机端新闻列表
查看>>
Linux 密钥验证
查看>>
windows下UDP服务器和客户端的实现
查看>>
MySQL各版本的区别
查看>>
[poj1006]Biorhythms
查看>>
迭代器
查看>>
elasticsearch type类型创建时注意项目,最新的elasticsearch已经不建议一个索引下多个type...
查看>>
jQury 跳出each循环的方法
查看>>
spring AOP 之五:Spring MVC通过AOP切面编程来拦截controller
查看>>
在编译安装程序时候遇到/usr/bin/ld: cannot find -lxxx的时候的解决办法。
查看>>
使用 INSERT 和 SELECT 子查询插入行
查看>>