题目描述

多米诺骨牌有上下2个方块组成,每个方块中有1~6个点。现有排成行的

上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|。例如在图8-1中,S1=6+1+1+1=9,S2=1+5+3+2=11,|S1-S2|=2。每个多米诺骨牌可以旋转180°,使得上下两个方块互换位置。 编程用最少的旋转次数使多米诺骨牌上下2行点数之差达到最小。

对于图中的例子,只要将最后一个多米诺骨牌旋转180°,可使上下2行点数之差为0。

输入输出格式

输入格式:

输入文件的第一行是一个正整数n(1≤n≤1000)n(1≤n≤1000)n(1≤n≤1000),表示多米诺骨牌数。接下来的n行表示n个多米诺骨牌的点数。每行有两个用空格隔开的正整数,表示多米诺骨牌上下方块中的点数a和b,且1≤a,b≤61≤a,b≤61≤a,b≤6。

输出格式:

输出文件仅一行,包含一个整数。表示求得的最小旋转次数。

输入输出样例

输入样例#1:

4
6 1
1 5
1 3
1 2

输出样例#1:

1
这道题是个背包,因为每组数倒一下体积相当于2∗c[i]2*c[i]2∗c[i](c[i]c[i]c[i]是两个数的差),贡献是1,这样一个背包模型就出来了。
状态转移方程:
f[j−c[i]∗2]=min(f[j−c[i]∗2],f[j]+1)f[j-c[i]*2] = min(f[j-c[i]*2],~f[j] + 1)f[j−c[i]∗2]=min(f[j−c[i]∗2], f[j]+1)

代码如下
//f[j] = min(f[j], f[j-2*c[i]] + 1)
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define T 5005
using namespace std;
int a[1003], b[1003], c[1003], f[20005], s, t;
int main(){memset(f, 1, sizeof(f));int i, j, n, m;scanf("%d", &n);for(i = 1; i <= n; i++) scanf("%d%d", &a[i], &b[i]), c[i] = a[i] - b[i], s += c[i];f[s + T] = 0;for(i = 1; i <= n; i++){if(c[i] > 0){for(j = 2*c[i]; j <= 2*T; j++){t = j - 2*c[i];if(f[j] < 1e7)f[t] = min(f[t], f[j] + 1);}}if(c[i] < 0){for(j = 2*T; j >= 0; j--){t = j - 2*c[i];if(f[j] < 1e7){f[t] = min(f[t], f[j] + 1);}}}}for(i = 0; i <= T; i++){if(f[i+T] < 1e7 || f[-i+T] < 1e7){t = min(f[i+T], f[-i+T]);printf("%d", t);return 0;}}return 0;
}

洛谷p1282多米诺骨牌相关推荐

  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] 多米诺骨牌

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

  5. 洛谷 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 ...

  6. C++ P1282 多米诺骨牌

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

  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. P1282 多米诺骨牌题解

    [题目链接] P1282 [解题思路] 这道题我本来是想用贪心,用sort从大到小排序后,减去两张骨牌的差直到最小,结果却发现自己WA了. 很显然我的贪心是错误的,于是我后来就用了老师教的 dpdpd ...

最新文章

  1. 1.2.3 TCP/PI参考模型(应用层、传输层、网际层、网络接口层)、五层参考模型(应用层、传输层、网络层、数据链路层、物理层)、OSI与TCP/IP参考模型比较
  2. bootstrap大图轮播手机端不能手指滑动解决办法
  3. 【机器学习】对于特征离散化,特征交叉,连续特征离散化非常经典的解释
  4. .QT-制作最强电压电阻表盘,可以自定义阴影效果,渐变颜色,图标,文字标签等-附带demo程序
  5. html css 知识回顾2
  6. 神级代码编辑软件(Sublime Text 3) v3.3114 汉化特别版
  7. Redis集群案例与场景分析
  8. zip()和enumerate()用于for-in中遍历可迭代对象
  9. SQL ALTER TABLE 语句在项目中的使用
  10. 服务器php 启动命令_php启动内置服务器
  11. mysql 全局权限入门
  12. linux 用命令安装软件,Linux安装软件的三种常用命令
  13. 【C语言】浅谈C语言数组%c%s打印逻辑及数组打印单个汉字
  14. 8、C语言printf函数与scanf函数
  15. 大屏可视化低代码开发平台网址
  16. 他励直流电动机matlab,直流他励电机为什么不能直接启动
  17. Apollo(一)-基本介绍
  18. 图解Java多线程设计模式——Java多线程基础
  19. 详解什么是BFC和BFC能解决什么问题
  20. 机器学习之Pandas教程(上)

热门文章

  1. 虚拟机架设服务器u盘不显示盘符,win7系统不显示u盘盘符虚拟机无法识别U盘的解法...
  2. Codeforeces——69A Young Physicist
  3. Dijkstra算法和Floyd算法超详解以及区别
  4. 啤酒与尿布的蝴蝶效应——关联分析
  5. C语⾔的标识符以及规范
  6. crontab每分钟执行一次任务
  7. 把Python代码封装成exe(windows的可执行程序)
  8. 尚硅谷docker基础篇 2018版
  9. Hoeffding's lemma证明
  10. c语言里什么叫double,c语言double什么意思