1.题目

POJ-1837

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的更多相关文章

  1. 题解-USACO18DEC Balance Beam详细证明

    (翻了翻其他的题解,觉得它们没讲清楚这个策略的正确性) Problem 洛谷5155 题意概要:给定一个长为\(n\)的序列,可以选择以\(\frac 12\)的概率进行左右移动,也可以结束并得到当前 ...

  2. POJ2142:The Balance——题解

    http://poj.org/problem?id=2142 题目大意:有一天平和两种数量无限的砝码(重为a和b),天平左右都可以放砝码,称质量为c的物品,要求:放置的砝码数量尽量少:当砝码数量相同时 ...

  3. 题解 [USACO18DEC]Balance Beam

    被概率冲昏的头脑~~~ 我们先将样例在图上画下来: 会发现,最大收益是: 看出什么了吗? 这不就是凸包吗? 跑一遍凸包就好了呀,这些点中,如果i号点是凸包上的点,那么它的ans就是自己(第二个点),不 ...

  4. Codeforces Beta Round #17 C. Balance DP

    C. Balance 题目链接 http://codeforces.com/contest/17/problem/C 题面 Nick likes strings very much, he likes ...

  5. The Balance(母函数)

    The Balance Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  6. hdu_5616_Jam's balance(暴力枚举子集||母函数)

    题目连接:hdu_5616_Jam's balance 题意: 给你一些砝码,和一些要被称出的重量,如果这些砝码能称出来输出YES,否则输出NO 题解:我们想想,这题求组合方式,我们这里可以直接用母函 ...

  7. HDU 5616 Jam's balance(Jam的天平)

    HDU 5616 Jam's balance(Jam的天平) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K ...

  8. Codeforces 1120 简要题解

    文章目录 A题 B题 C题 D题 E题 F题 传送门 A题 传送门 题意简述:给你一个mmm个数的数列,现在规定把一个数列的1,2,...,k1,2,...,k1,2,...,k分成第一组,把k+1, ...

  9. codeforces 17C Balance(动态规划)

    codeforces 17C Balance 题意 给定一个串,字符集{'a', 'b', 'c'},操作是:选定相邻的两个字符,把其中一个变成另一个.可以做0次或者多次,问最后可以生成多少种,使得任 ...

随机推荐

  1. [CF1073G]LCP问题

    题意:给一个长n的字符串S,q组询问,每组给两个集合A,B.求集合A中的点和集合B中的点所有组合情况的lcp的和. 思路: 好像比较常规,可是代码能力差还是调了1.5h.主要还是虚树板子不熟(加入的时 ...

  2. Python 生成图片验证码

    验证码图片生成 #!/usr/bin/env python # -*- coding: utf-8 -*- # refer to `https://bitbucket.org/akorn/wheezy ...

  3. Spring cloud gateway 如何在路由时进行负载均衡

    本文为博主原创,转载请注明出处: 1.spring cloud gateway 配置路由 在网关模块的配置文件中配置路由: spring: cloud: gateway: routes: - id: ...

  4. 【Redis】Redis Cluster初始化及PING消息的发送

    Cluster消息类型定义 #define CLUSTERMSG_TYPE_PING 0 /* Ping消息类型,节点间进行通信交换信息的消息 */ #define CLUSTERMSG_TYPE_P ...

  5. 20.LVS负载均衡群集—NAT模式实例

    LVS负载均衡群集-NAT模式实例 目录 LVS负载均衡群集-NAT模式实例 群集引用概述 群集的含义 问题 解决方法 企业群集分类 群集的三种类型 负载均衡群集(Load Balance Clust ...

  6. Error: $controller:ctrlreg A controller with this name is not registered.

    The controller with the name 'SomeController' is not registered.名称为'SomeController'的控制器没注册 : Descrip ...

  7. js 表面学习 - 认识结构

    JavaScript 语句由以下构成: 值.运算符.表达式.关键词和注释. 这条语句告诉浏览器在 id="demo" 的 HTML 元素中输出 "Hello Kitty. ...

  8. TypeScript ReadonlyArray(只读数组类型) 详细介绍

    1.ReadonlyArray 简介 在TypeScript中,除了Array<T>类型,还有一个ReadonlyArray<T>类型,ReadonlyArray类型和Arra ...

  9. Java中Double类型数据比较大小

    方法一:转成字符串之后比较 如果要比较的两个double数据的字符串精度相等,可以将数据转换成string然后借助string的equals方法来间接实现比较两个double数据是否相等.注意这种方法 ...

  10. VScode运行总是显示running状态

    一.每次点击运行都显示code is already running,而且键盘也没有办法输入 二.解决办法 注意:记得重新启动VScode