[题解]Balance
1.题目
2.题目大意
一个天平上有一些钩子,现在有一些砝码。给出每个钩子到原点(姑且这么叫吧)的距离(-15 ~ 15,负数代表在左边,正数相反)以及砝码的重量(1 ~ 20),求出把所有的砝码挂上天平并且让天平保持平衡的方案数。
3.分析
显然,暴力枚举必然会TLE。那么,看到方案总数四个数就想到了数论和DP。
在这道题里,可以看出要用DP。
设\(f_{i,j}\)为:把前 \(i\) 个砝码全部放到天平,倾斜度为 \(j\) 的方案总数。
规定正数为向右偏,负数为向左偏。
这里讲一下输入数据对于答案的贡献:如果第 \(i\) 个砝码放在 \(dis_k\) 的位置时,它的倾斜度为:dis[k]*wei[i]
。
那么,必然有负数下标,所以改用Pascal所以要把所有 \(j\) 加上一个数,使得全是正数。考虑题目的极限数据:距离范围最大15,重量范围最大25,个数范围最大20,所以极限倾斜度为:\(15 \times 25 \times 20=7500\)。所以,所有的 \(j\) 都要加上7500。答案为:\(f_{n,7500}\)。
假设我们已经成功的推出了 \(f_{i-1,j}\) 考虑转移方程。显然,我们可以枚举第 \(i\) 个砝码的位置,所以所有的位置都要试一遍。假设我们放在第 \(k\) 个位置,\(j=j+dis_k \times wei_i\)。那么,现在仅仅是多放第 \(i\) 个砝码在第 \(k\) 个位置,所以方案数是没有变动的。换而言之,\(f_{i,j+dis_k \times wei_i}\)是要继承\(f_{i-1,j}\)的方案总数的。
注意,这里我们是 \(f_{i-1,j} \to f_{i,j+dis_k \times wei_i}\) 的,因为 \(k\) 是有变动的,所以 \(f_{i-1,j}\)有对多个状态有贡献。它们必然会形成一张复杂的网,那么对同一个状态重复贡献,所以需要把贡献给加起来。其实最好的办法就是当 \(f_{i-1,j} \to f_{i,j+dis_k \times wei_i}\)时,做一个操作f[i][j+dis[k]*wei[i]]+=f[i-1][j]
。
4.代码
如果还是看不懂,看看代码吧。
抄袭可耻!!!
4.1dp代码
for(int i=1;i<=n;++i)
for(int j=0;j<=15000;++j)
for(int k=1;k<=m;++k)
f[i][j+dis[k]*wei[i]]+=f[i-1][j];
4.2AC代码
#include<cstdio>
#include<cstring>
using namespace std;
int m,n,dis[23],wei[23],f[23][15003];
int main()
{
scanf("%d%d",&m,&n);
for(int i=1;i<=m;++i) scanf("%d",&dis[i]);
for(int i=1;i<=n;++i) scanf("%d",&wei[i]);
f[0][7500]=1;\\这里相当于一开始什么都没放
for(int i=1;i<=n;++i)
for(int j=0;j<=15000;++j)
for(int k=1;k<=m;++k)
f[i][j+dis[k]*wei[i]]+=f[i-1][j];
printf("%d",f[n][7500]);
}
5.参考文献
https://www.cnblogs.com/lyy289065406/archive/2011/07/31/2122629.html
[题解]Balance的更多相关文章
- 题解-USACO18DEC Balance Beam详细证明
(翻了翻其他的题解,觉得它们没讲清楚这个策略的正确性) Problem 洛谷5155 题意概要:给定一个长为\(n\)的序列,可以选择以\(\frac 12\)的概率进行左右移动,也可以结束并得到当前 ...
- POJ2142:The Balance——题解
http://poj.org/problem?id=2142 题目大意:有一天平和两种数量无限的砝码(重为a和b),天平左右都可以放砝码,称质量为c的物品,要求:放置的砝码数量尽量少:当砝码数量相同时 ...
- 题解 [USACO18DEC]Balance Beam
被概率冲昏的头脑~~~ 我们先将样例在图上画下来: 会发现,最大收益是: 看出什么了吗? 这不就是凸包吗? 跑一遍凸包就好了呀,这些点中,如果i号点是凸包上的点,那么它的ans就是自己(第二个点),不 ...
- Codeforces Beta Round #17 C. Balance DP
C. Balance 题目链接 http://codeforces.com/contest/17/problem/C 题面 Nick likes strings very much, he likes ...
- The Balance(母函数)
The Balance Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- hdu_5616_Jam's balance(暴力枚举子集||母函数)
题目连接:hdu_5616_Jam's balance 题意: 给你一些砝码,和一些要被称出的重量,如果这些砝码能称出来输出YES,否则输出NO 题解:我们想想,这题求组合方式,我们这里可以直接用母函 ...
- HDU 5616 Jam's balance(Jam的天平)
HDU 5616 Jam's balance(Jam的天平) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K ...
- Codeforces 1120 简要题解
文章目录 A题 B题 C题 D题 E题 F题 传送门 A题 传送门 题意简述:给你一个mmm个数的数列,现在规定把一个数列的1,2,...,k1,2,...,k1,2,...,k分成第一组,把k+1, ...
- codeforces 17C Balance(动态规划)
codeforces 17C Balance 题意 给定一个串,字符集{'a', 'b', 'c'},操作是:选定相邻的两个字符,把其中一个变成另一个.可以做0次或者多次,问最后可以生成多少种,使得任 ...
随机推荐
- 图的连通性--Tarjan算法
一些概念 无向图: 连通图:在无向图中,任意两点都直接或间接连通,则称该图为连通图.(或者说:任意两点之间都存在可到达的路径) 连通分量: G的 最大连通子图 称为G的连通分量. 有向图 (ps.区别 ...
- 【Java面试】说说你对Spring MVC的理解
一个工作了7年的粉丝,他说在面试之前,Spring这块的内容准备得很充分. 而且各种面试题也刷了,结果在面试的时候,面试官问:"说说你对Spring MVC的理解". 这个问题一下 ...
- Mysql命令行插入字段超长不报错,而jdbc报错问题分析
异常信息 exception.ServiceException: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long ...
- vs2022+resharper创建模板——实现在新建文件的时候自动生成防卫式声明和自定义语句
在网上找了很久如何让visual studio新建文件的时候自动生成注释和防卫式声明,虽然防卫式声明可以用#proga once替代,但是在clion里可以自动生成vs里面没法自动生成还是觉得难受,于 ...
- 渗透测试之sql注入验证安全与攻击性能
由于渗透测试牵涉到安全性以及攻击性,为了便于交流分享,本人这里不进行具体网址的透露了. 我们可以在网上查找一些公司官方网站如(http://www.XXXXXX.com/xxxx?id=1) 1.拿到 ...
- 对TCP粘包拆包的理解
TCP的粘包与拆包 TCP是一种字节流(byte-stream)协议,所谓流,就是没有界限的一串数据. 一个完整的包会被TCP拆为多个包进行发送,也有可能把多个小包封装成一个大的数据包发送,这就是所谓 ...
- 【Java面试】什么是可重入,什么是可重入锁? 它用来解决什么问题?
一个工作了3年的粉丝,去一个互联网公司面试,结果被面试官怼了. 面试官说:"这么简单的问题你都不知道? 没法聊了,回去等通知吧". 这个问题是: "什么是可重入锁,以及它 ...
- 机器学习中 TP FP TN FN的概念
二分类 在二分类问题中,TP FP TN FN 是非常清楚且易于理解的. TP (True Positive) : 预测为 1 ,真实值也为 1 -> 真阳性 FP (False Positiv ...
- Canal实现MySQL协议
目录 代码流程 执行dump前 执行dump 在学习Canal的时候很好奇Canal是如何模拟成MySql Slave来接收数据的 MySql Slave会向主库发送dump协议来接收bin-log数 ...
- 拒绝蛮力,高效查看Linux日志文件!
原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介 日常分析问题时,会频繁地查看分析日志,但如果蛮力去查看日志,耗时费力还不一定有效果,因此我总结了在Linux常用的 ...