有一个天平,天平左右两边各有若干个钩子,总共有C个钩子,有G个钩码,求将钩码全部挂到钩子上使天平平衡的方法的总数。(距离小于15,重量小于25,钩子和钩码都少于20个)
其中可以把天枰看做一个以x轴0点作为平衡点的横轴。
别看数据小,搜索只能过3个点,那方案数巨多无比,要用int64。
定义平衡度:当前所挂砝码分别乘其坐标的和,很明显平衡度=0时满足条件。
用f[i,j]表示当前挂到第i个钩子,平衡度为j的方案数,f[i,j]=xigema{f[i-1,k-x[k]*y[i]]},y记坐标,x记重量。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 program balance(input,output); 2 const 3 maxw = 2000; 4 var 5 x,y : array[0..25] of longint; 6 f : array[0..25,-maxw..maxw+1000] of int64; 7 n,m : longint; 8 procedure init; 9 var 10 i : longint; 11 begin 12 readln(m,n); 13 for i:=1 to m do 14 read(x[i]); 15 for i:=1 to n do 16 read(y[i]); 17 end; { init } 18 procedure main; 19 var 20 i,j,k : longint; 21 begin 22 fillchar(f,sizeof(f),0); 23 f[0,0]:=1; 24 for i:=1 to n do 25 for j:=1 to m do 26 for k:=-maxw to maxw do 27 f[i,k+x[j]*y[i]]:=f[i,k+x[j]*y[i]]+f[i-1,k]; 28 end; { main } 29 procedure print; 30 begin 31 writeln(f[n,0]); 32 end; { print } 33 begin 34 assign(input,'balance.in');reset(input); 35 assign(output,'balance.out');rewrite(output); 36 init; 37 main; 38 print; 39 close(input); 40 close(output); 41 end.