題目大意:
給定一個形式的天枰,天枰上遠離中點的不同距離擁有鉤子。給定各種重量砝碼,問必須懸掛所有砝碼的前提下,維持天枰平衡的掛法數為多少?
暴力嘗試的枚舉量驚人,顯然即使天枰當前不平衡,但它的“不平衡度”是可以利用的。關鍵是如何設計DP狀態。普遍的做法是以i個物品為階段,計算懸掛到第i個物品時,當前平衡度達到v的方法總數。易得 -7500<=v<=7500; dp[i][v]=∑dp[i-1][v-hoox[j]*w[i]] → dp[i][v+inf]=∑dp[i-1][v-hoox[j]*w[i]+inf]。常數 inf 僅為保證數組下標不為負。我們明顯發現它在形式上類似于背包問題,等價于在v容背包中,嘗試放入重量為hoox[j]*w[i]的物品,換取收益一種方法。
容易理解,初始解 dp[0][0+inf]=1,目標解 dp[m][0+inf] 。
類比:
http://acm.ustc.edu.cn/ustcoj/problem.php?id=1116
DD牛 << 背包九講 >>
1
#include<cstdio>
2
#include<cstring>
3
#define G 21
4
#define N 21
5
#define inf 7500
6
7
int dp[G][inf+inf+1];
8
int w[G],h[N];
9
10
int main()
{
11
int n,m,i,j,v;
12
while(scanf("%d%d",&n,&m)!=EOF)
{
13
for(i=0;i<n;i++) scanf("%d",&h[i]);
14
for(i=1;i<=m;i++) scanf("%d",&w[i]);
15
16
memset(dp,0,sizeof(dp));
17
dp[0][0+inf]=1;
18
19
for(i=1;i<=m;i++)
20
for(v=-1*inf;v<=inf;v++)
21
for(j=0;j<n;j++)
22
if( v-h[j]*w[i]+inf+1 )
23
dp[i][v+inf]+=dp[i-1][v-h[j]*w[i]+inf];
24
25
printf("%d\n",dp[m][0+inf]);
26
}
27
return 0;
28
}
29