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