解题思路:
每向天平中方一个重物,天平的状态就会改变,而这个状态可以由若干前一状态获得。
定义dp[i][j]为表示放入i个砝码后到达状态j的方法数。由于最重25,最多20个,长最多15,所以为25*20*15 = 7500,范围是-7500,7500,平横时j是0,但下标避免负数,为0-15000,平衡时为7500。
所以状态转移方程:dp[i][ j+ w[i]*c[k] ]= ∑(dp[i-1][j])
源码:
#include <iostream>
#include <memory.h>
using namespace std;
int dp[21][15001];//表示放入i个砝码后到达状态j
//最重25,最多20个,长最多15,
//所以为25*20*15 = 7500
//范围是-7500,7500,平横是0
//小标避免负数,为0-15000,平衡时7500
using namespace std;
int main()
{
int n,g;
int c[21];
int w[21];
cin>>n>>g;
for(int i=1;i<=n;i++)
cin>>c[i];
for(int j=1;j<=g;j++)
cin>>w[j];
memset(dp,0,sizeof(dp));
dp[0][7500] = 1;//最初无砝码平衡,1种方法
for(int i=1;i<=g;i++)
for(int j=0;j<=15000;j++)
for(int k=1;k<=n;k++)
dp[i][j+w[i]*c[k]] += dp[i-1][j];
cout<<dp[g][7500]<<endl;
return 0;
}