zoukankan      html  css  js  c++  java
  • POJ1837 Balance 动态规划

    题意:有这样的一个天平,关于天平的中心两边有一些钩子,钩子有一个属性就是离中心的距离。题中给定的是设中心的坐标为0,左右两边分别是负数和正数的坐标值。现在给定一些砝码,问将这些砝码都挂到天平上,使得天平保持平衡的方式有多少种?一个钩子上可以连续挂上多个砝码。

    解法:首先将所有钩子的坐标都加上15,然后使得最后砝码乘以坐标的总和等于总质量乘以15。这样原问题就转化为一个类似于背包的问题了。

    代码如下:

    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    #include <cstdio>
    using namespace std;
    
    int sta, N, M;
    int h[25], g[25];
    int f[25][15005];
    // f[i][j]表示到第i件物品,重量为j的种数有多少种 
    
    void solve() {
        memset(f, 0, sizeof (f));
        f[0][0] = 1;
        for (int i = 1; i <= M; ++i) {
            for (int j = 0; j <= sta; ++j) {
                for (int k = 1; k <= N; ++k) {
                    if (j >= g[i]*h[k]) {
                        f[i][j] += f[i-1][j-g[i]*h[k]];
                    }
                }
            }
        }
        printf("%d\n", f[M][sta]);
    }
    
    int main() {
        while (scanf("%d %d", &N, &M) != EOF) {
            sta = 0;
            for (int i = 1; i <= N; ++i) {
                scanf("%d", &h[i]); // 钩子
                h[i] += 15;
            }
            for (int i = 1; i <= M; ++i) {
                scanf("%d", &g[i]); // 砝码 
                sta += g[i];
            }
            sta *= 15;
            solve();
        }
        return 0;    
    }
  • 相关阅读:
    5
    4
    3
    crontab -e 报错(E518: Unknown option: foldenable)
    解决无法修改日志时间的问题(Local time zone must be set--see zic manual page 2019 )
    ping测试丢包率
    关闭SELinux
    iotop使用方法
    mysql的备份
    修改uid gid 的起始范围
  • 原文地址:https://www.cnblogs.com/Lyush/p/2979708.html
Copyright © 2011-2022 走看看