POJ-1837 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;    
}

 

你可能感兴趣的:(动态规划)