题目

LP1282

思路

本题总体不难。。甚至我觉得难度评级应该是普及+/提高。。。但就是做了一上午。。
自己要蠢死啦。。

大体思路是这样的,思考以后就会发现,本题其实是一个纠正差值的问题,拿这样样例举例:

4
6 1
1 5
1 3
1 2

可以看到,上面点数之和为9,下面点数之和为11,差值为2(暂不考虑正负)。
而每张牌,都有自己的“可修正差值数”,比如第一张牌就是10(上面减5下面加5)。样例的情况,用最后一张牌,可修正数差值数为2,直接用它一张就可以了。

那么我们需要找到这个问题的普遍解决方法:
1.计算出差值C,当上面点数较大时,C为正。
2.计算出每张牌的“可修正差值数”A[i],当翻过来以后上面点数减少时,A[i]为正。
3.用A[1…n]凑出差值C,要求所用到牌数最少,输出最少牌数即可。

实现方法:
1~2.直接算即可,2计算时不要忘了乘2。
3.此处使用01背包

代码

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#define _for(i,a,b) for(int i = (a); i<(b); i++)
#define _rep(i,a,b) for(int i = (a); i<=(b); i++)
using namespace std;const int INF = 1 << 28;
const int maxn = 1000 + 10;
const int maxs = 10000;
int n, C, A[maxn], d[maxn][2 * maxs];  //C为差值int main() {scanf("%d", &n);int a, b, S1 = 0, S2 = 0;_rep(i, 1, n) {scanf("%d%d", &a, &b);A[i] = (a - b) * 2;S1 += a, S2 += b, C += (a - b);   // max(S1,S2)为理论上,需要凑的数的最大值}_rep(i, 0, n)  // 因为j可能为负,为了防止访问负下标,所以使用maxsfor (int j = maxs - max(S1, S2); j < maxs + max(S1, S2); j++) {// 相当于d的初始化操作if (i == 0) {if (j == maxs) d[0][j] = 0;else d[0][j] = INF;continue;}d[i][j] = d[i - 1][j];if (j - A[i] >= maxs - max(S1, S2) && j - A[i] < maxs + max(S1, S2))d[i][j] = min(d[i][j], d[i - 1][j - A[i]] + 1);}int ans;   // 达到点数之差最小的时候_rep(i, 0, n) {ans = d[n][C + maxs + i - 1];if (ans <= 1000) break;ans = d[n][C + maxs - i - 1];if (ans <= 1000) break;}printf("%d\n", ans);return 0;
}

[多阶段DP] 洛谷P1282 多米诺骨牌 (01背包)相关推荐

  1. 【动态规划】洛谷 P1282 多米诺骨牌

    [动态规划]洛谷 P1282 多米诺骨牌 时间限制: 1 Sec  内存限制: 128 MB 题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下 ...

  2. 洛谷P1282 多米诺骨牌 题解

    洛谷P1282 多米诺骨牌 题解 题目链接:P1282 多米诺骨牌 题意: 多米诺骨牌由上下 222 个方块组成,每个方块中有 1∼61\sim61∼6 个点.现有排成行的上方块中点数之和记为 S1S ...

  3. 【01背包】洛谷P1282多米诺骨牌

    题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S1=6+1+1+1=9, ...

  4. 洛谷p1282多米诺骨牌

    题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S1=6+1+1+1=9, ...

  5. 洛谷 [P1282] 多米诺骨牌

    这道题是一道背包问题,考虑一个背包, 显然如果我们直接设dp[i]表示前i个使差值最小所需的最少翻转次数,是具有后效性的. 所以我们将直接求最值,改为求某个值是否可行,这种求最值转变为求可行性的思想是 ...

  6. 洛谷 1282 多米诺骨牌#线性动态规划#

    分析 状态转移方程:f[i+1][j+a[i]]=max(f[i][j]),f[i+1][j+b[i]]=max(f[i][j]+1)f[i+1][j+a[i]]=max(f[i][j]),f[i+1 ...

  7. P1282 多米诺骨牌 (差值DP+背包)

    题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S1=6+1+1+1=9, ...

  8. P1282 多米诺骨牌

    题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S1=6+1+1+1=9, ...

  9. C++ P1282 多米诺骨牌

    题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S1=6+1+1+1=9, ...

  10. 洛谷P1510-精卫填海(01背包)

    题目描述: [问题描述] 发鸠之山,其上多柘木.有鸟焉,其状如乌,文首,白喙,赤足,名曰精卫,其名自詨.是炎帝之少女,名曰女娃.女娃游于东海,溺而不返,故为精卫.常衔西山之木石,以堙于东海.--< ...

最新文章

  1. 史上最强神经网络绘制神器来啦!一系列暗黑操作!
  2. IIS 6.0的web园 最大工作进程数
  3. java8 guava_Guavate:桥接Guava和Java8的微型库
  4. java飞鸽传书_feige 飞鸽传书源代码java 实现不错的联系网络编程的资料飞鸽传书的GUI(java实现) - 下载 - 搜珍网...
  5. C# 利用DotRas 操作adsl
  6. Python工作笔记-使用Py遍历文件夹及其子文件夹内容
  7. 自如总部摘牌?官方回应:更换logo 业务一切正常
  8. 朱啸虎回应“美团滴滴合并”;小米成世界第四大手机制造商;Ant Design 3.26.1 发布 | 极客头条...
  9. jsx后缀的是什么文件_React核心特性-从JSX到虚拟DOM
  10. vue-计算属性不能直接修改
  11. 第五节、矩阵分解之LU分解
  12. Deepin搭建Qt5开发环境
  13. mysql中计算百分比
  14. 框架系列课程-Spring新版本
  15. “深挖”小红书:内容+电商危机下还能走多远?
  16. Chrome OS 旅程的下一步
  17. 爬虫学习5——requests进阶(cookie登录、防盗链、
  18. 嵌入式设计与开发项目-DHT11温湿度传感器程序设计
  19. 【量化交易】如何搭建本地化量化投研软件系统
  20. 美通企业日报 | 都是博士生的西湖大学开学了;34家企业获年度互联网经济大奖...

热门文章

  1. (三) 图像空间域增强——点运算
  2. python如何写日志_python写日志
  3. 可乐要加冰才好喝啊 --- 装饰模式
  4. android短消息中心号码,短信服务中心号码(SMSC)的设置方法
  5. 博客群建软件-Google会认为哪些网站是作弊网站?
  6. HTML文档繁转简,excel简繁转换 切换到“审阅”,点击“繁转简”:
  7. Freemarker数字格式化总结
  8. 坦克类游戏的制作之路
  9. 如何给客户做产品培训
  10. 21世纪最牛逼思想家的心路历程小结———哲学、宿命论