首页 > 其他分享 >POJ 1837 Balance

POJ 1837 Balance

时间:2022-12-24 11:33:21浏览次数:40  
标签:1837 int 天平 POJ basic Balance sum

POJ 1837 Balance

题意:

一个天平上有 \(C(2<=C<=20)\) 个挂钩,挂钩所在位置在区间 \([-15,15]\)。

你的手里有 \(G(2<=G<=20)\)个砝码,每个砝码的重量在区间 \([1,25]\) 。

求天平平衡的方法数。

思路:

根据物理知识可得 : 重量 = 力矩 * 重量

状态定义?

显然,当我们加入一个新砝码的时候,需要知道放入之前已有的天平对应的平衡数值。

定义 \(f[i][j]\) 为遍历到第 \(i\) 个物品,当前天平的平衡值为 \(j\) 的方案数。

因为可能出现负数,所以这里采用 \(basic = 7501\) (根据极限情况取得)来校准。

转移方程: \(f[i][j]\; += \sum_{k = 1} ^n f[i - 1][j - s[k] * w[i]]\)

实现:

#include <cstdio>
#include <algorithm>
using namespace std;
// 重量 = 力矩 * 重量
const int N = 25, basic = 7501, M = 2e4, INF = 2e5;
int a[N], w[N];
int f[N][M];
int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    for (int i = 1; i <= m; i++)
        scanf("%d", &w[i]);

    f[0][basic] = 1;
    // 遍历物品
    for (int i = 1; i <= m; i++)
    {
        // 遍历差值
        for (int j = 0; j < M; j++)
        {
            // 遍历放的位置
            for (int k = 1; k <= n; k++)
            {
                int sum = j - a[k] * w[i];
                if (sum >= 0 && sum < M)
                {
                    f[i][j] += f[i - 1][sum];
                }
            }
        }
    }
    printf("%d\n", f[m][basic]);
    return 0;
}

标签:1837,int,天平,POJ,basic,Balance,sum
From: https://www.cnblogs.com/zxr000/p/17002523.html

相关文章

  • POJ 1159 Palindrome
    POJ1159Palindrome题意:给出一个字符串,求最少插入多少个字符可以让该字符串变成回文字符串思路1:思路1是卡过去的(用\(short\)换\(int\)和用了一个常数优化),所......
  • POJ 1080 Human Gene Functions
    POJ1080HumanGeneFunctions题意:给出两组\(DNA\)序列求它们的最大相似度每个字母与其他字母或自身和空格对应都有一个打分,求在这两个字符串中插入空格,让这两个字......
  • POJ 3176 Cow Bowling
    POJ3176CowBowling题意:给出一个数字三角形,每个分叉路口可以选择一条道路向下走,获得路上的点的权值。求可以获得的最大权值是多少?思路:从上向下走和从下向上走是一......
  • POJ 1163 The Trangle
    POJ1163TheTrangle题意:给出一个数字三角形,每个分叉路口可以选择一条道路向下走,获得路上的点的权值。求可以获得的最大权值是多少?定义状态:我们需要知道当每个位置......
  • POJ 3278 Catch That Cow(BFS)
    POJ3278CatchThatCow​ 现在你在一个数轴上的位置x,位置k上有一头牛,你要抓住这头牛,也就是走到位置k上。那怎么走呢?你有两种走路的方法,一种是从x移动到\(2\tim......
  • POJ-1088 滑雪
    POJ-1088滑雪有一个平面区域,上面有一些点,每个点对应一定的权值,每次移动只能从当前位置向上下左右四个方向中,权值小于当前位置权值的点移动,一次性最多可以移动多远(相邻位......
  • POJ-2533 Longest Ordered Subsequence
    POJ-2533LongestOrderedSubsequence题意:给出一个序列,求出这个序列的最长上升子序列序列\(A\)的上升子序列\(B\)定义如下:\(B\)为\(A\)的子序列\(B\)为严......
  • POJ-1458 Common Subsequence
    POJ-1458CommonSubsequence题意:首先对最长子序列有个定义:如果一个字符串a可以由另一个字符串b删去某些元素得到,那么说明a就是b的子序列字符串现在有两个字符串,请问最......
  • UVA 673 Paretheses Balance
    原题Vjudge题目大意怼给你一堆括号,判断是否合法有三条规则(1)空串合法(2)如果\(A和B\)都合法,则\(AB\)合法(例如:\(()和[]\)都合法,则\(()[]\)合法)(3)如果\(A\)合法,则\((A)和[A......
  • [算法][解析几何]覆盖最多点固定半径圆问题 POJ1981 圆的扫描线 详细解法
    引题: 覆盖最多点固定半径圆问题改编自POJ1981CircleandPoint 背景:在二维平面中给定n个点,求半径为r的圆最多可以覆盖多少个点(1<=n<=300,精度eps=0.0001)输入......