#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int M =30;
int c[M];// hook的位置
int w[M]; //砝码的重量
//放一个砝码对平衡对j所产生的影响为 臂长*重量 c[i]*w[i]
int dp[M][16000]; //dp[i][j] 放前i个砝码时 平衡度为j的方法数
//平衡点为负数时表示向左偏 c[i] 范围为 -15~15 砝码重量量为1~25 数量为1~20 下标不为负数所以25*15*20=7500以下为负数
int main()
{
int C,G;
cin>>C>>G;
for(int i=1;i<=C;i++)
{
cin>>c[i];
}
for(int i=1;i<=G;i++)
{
cin>>w[i];
}
memset(dp,0,sizeof(dp));
dp[0][7500]=1;//前0件 平衡度为0时 方法数为1
for(int i=1;i<=G;i++)
{
for(int j=0;j<15000;j++)
{
for(int k=1;k<=C;k++)
{
if(j>=c[k]*w[i]&&dp[i-1][j-c[k]*w[i]]) //求方法数时dp[i-1][j-c[k]*w[i]] 前i-1件平衡度为j-c[k]*w[i]的方法数要存在
{
dp[i][j]+=dp[i-1][j-c[k]*w[i]];
}
}
}
}
cout<<dp[G][7500]<<endl;
return 0;
}
poj 1837 Balance 01背包(方法数)
最新推荐文章于 2022-05-13 10:40:30 发布