您的位置:首页 > 其它

POJ 1837 Balance(DP动态规划)

2011-02-25 00:10 513 查看
//DP,动态规划求组合数,dp[i][j]表示前i个重锤获得重量j有几种方式
//转移方程dp[i][j+k] += dp[i-1][j];k为新添加第I个重锤的质量
//对重锤对应钩子将其分组后来处理
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int dp[25][1000];
int C[25],G[25];
int N,M;
const int mid = 500;
void DP()
{
dp[0][mid] = 1;//初始化
for(int i = 1;i <= M;++i)
{
for(int k = 0;k < 1000;++k)
{
for(int j = 1;j <= N;++j)
{
if(dp[i-1][k] == 0)	continue;
dp[i][k + G[i]*C[j]] += dp[i-1][k];
}
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d%d",&N,&M) != EOF)
{
for(int i = 1;i <= N;++i)	scanf("%d",&C[i]);
for(int i = 1;i <= M;++i)	scanf("%d",&G[i]);
DP();
printf("%d/n",dp[M][mid]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: