1. 程式人生 > >POJ-1837-Balance(dp)

POJ-1837-Balance(dp)

題意: 有一個天平,給你一些秤砣,和幾個位置,求有幾種讓天平平衡的方法。
解題思路: dp[i][j] 定義為i個秤砣組成j重的方法。因為位置有負數,但是陣列下標不能為負,所以當天平平衡的時候,平衡點不能為0, 由題意得天平最重的時候為
20*25*15 = 7500,所以讓7500為平衡點,這樣就不會出現下標為負的情況。
初始化 dp[0][7500] = 1;

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

const int N = 15005;
int dp[20
][N]; int dis[25]; int wei[25]; int main() { int c, n; while (~scanf("%d%d", &c, &n)) { memset(dp, 0, sizeof(dp)); for (int i = 1; i <= c; i++) { scanf("%d", &dis[i]); } for (int i = 1; i <= n; i++) { scanf("%d", &wei[i]); } dp[0
][7500] = 1; for (int i = 1; i <= n; i++) { for (int j = N; j >= 0; j--) { if (dp[i - 1][j]) { //如果i - 1個秤砣可以組成j個重量,那麼i個秤砣可以組成j + dis[k] * wei[i]個重量 for (int k = 1; k <= c; k++) { dp[i][j + dis[k] * wei[i]] += dp[i - 1
][j]; // printf("i %d\tj %d\n", i, j + dis[i] * wei[k]); } } } } printf("%d\n", dp[n][7500]); } return 0; }