/*dp
首先看到这道题的时候,不是很理解,想了很久写一下自己的
想法,
给你 m 个 砝码, n 位置个位置 在这些位置上放砝码,如果
天平平衡了,视为一种方式,问有多少方案
思路:枚举所有的状态,dp[i][j] 表示第 i 个砝码,当平衡
度为 j 的方案数,那么怎么推到状态转移方程呢?
dp[i][j+x] += dp[i-1][j];这个是确定的,因为他是用前面那个
状态推出来的,x 显然等于 a[j]*b[i]....
*/
#include<cstdio>i
#include<cstring>
#include<iostream>
using namespace std;
int a[10008],b[10008];
int dp[22][15008];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=m;i++)
scanf("%d",&b[i]);
memset(dp,0,sizeof(dp));
dp[0][7500] = 1;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
int l = a[j]*b[i];
for(int v=0;v<15000;v++)
{
dp[i][v+l] += dp[i-1][v ];
}
}
cout<<dp[m][7500]<<endl;
}
}
poj 1837
最新推荐文章于 2022-05-13 10:40:30 发布