背包问题,先找状态方程。
输入c,g。c代表挂钩的数量。g代表砝码的数量。
然后输入c个数代表挂钩的位置。
g个数代表砝码的质量。
判断当g个砝码都放上去的时候,平衡状态一共有几种。
对于可能的状态为-7500~7500(7500=15*20*25)即为0~15000;
设立状态数组dp[21][15000];21代表着放上去的砝码的个数,共有20种可能,因为最多只有20个砝码。
15000代表着此时的状态,7500时为平衡状态。
显然可以得到状态方程:
if(dp[i-1][j])
{
for(i=1;i<=c;i++)
{
dp[i][j+a[k]*b[i]]+=dp[i-1][j];
}
}
则dp[g][7500]的数值即为当所有的砝码都放上去的时候,平衡状态的种类了;
程序:
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
int main()
{
int c,g,i,k,j;
int a[50],b[50];
int dp[21][15001];
cin>>c>>g;
for(i=0;i<c;i++)//挂钩
cin>>a[i];
for(i=0;i<g;i++)//砝码
cin>>b[i];
memset(dp,0,sizeof(dp));
dp[0][7500]=1;
for(i=1;i<=g;i++)
{
for(j=0;j<=15000;j++)
{
if(dp[i-1][j])
{
for(k=0;k<c;k++)//挂钩
{
dp[i][j+a[k]*b[i-1]]+=dp[i-1][j];
}
}
}
}
cout<<dp[g][7500]<<endl;
return 0;
}