這個題目我想了半天得不出理想的答案,最後Google一番之後,發現自己的DP太弱了
題意:現在有一個天平,還有C個掛鉤和G個砝碼,求解又多少種方法能使得天平平衡(註意必須使用所有的砝碼)
可以根據題目的數據量算出開數組的範圍最大爲7500,由於可能出現負數,double it.
狀態:dp[i][j] 表示放第i個砝碼的時候達到j的重量時候的方法數
狀態轉移: dp[i][j] += dp[i-1][j-w[i]*b[k]],(1 <= k <= b_cnt )
初始化爲:dp[0][DELTA], ans = dp[n][DELTA]
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAXN 21
#define DELTA 7500
#define MAXV 1<<13
int f[MAXN][MAXV], b[MAXN], w[MAXN], b_cnt, w_cnt;
int dfs(int first, int second)
{
if( -1 != f[first][second] ) {
return f[first][second];
}
f[first][second] = 0;
for(int i = 1; i <= b_cnt; i ++) {
f[first][second] += dfs(first-1, second-b[i]*w[first]);
}
return f[first][second];
}
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen("test.in", "r", stdin);
#endif
while( ~scanf("%d %d", &b_cnt, &w_cnt) ) {
for(int i = 1; i <= b_cnt; i ++) {
scanf("%d", &b[i]);
}
for(int i = 1; i <= w_cnt; i ++) {
scanf("%d", &w[i]);
}
memset(f, -1, sizeof(f));
for(int i = 0; i <= DELTA+DELTA; i ++) {
f[0][i] = 0;
}
f[0][DELTA] = 1;
printf("%d\n", dfs(w_cnt, DELTA));
}
return 0;
}
poj_1837 Balance( 線性DP模型 )
最新推荐文章于 2019-04-17 23:23:03 发布