您的位置:首页 > 其它

POJ 1837 Balance(DP)

2016-10-17 21:04 357 查看
题目:POJ 1837 Balance

题意:给一个天平,天平的左右臂长都为15,现在给c个挂钩位置和g个质量的勾码,求有几种方式放勾码可以使天平保持平衡。

解析:用到DP,所以要先弄清DP中的i和j是干什么用的,i的作用是用于存用了几个勾码,j的作用是用于存状态,比如都放在一边的头上,就是最大的之15*20*20=6000,

当j=6000时处于平衡,所以要开6000*2=12000的数组,状态转移方程是dp[i][j+c[i]*g[k]]+=dp[i-1][j],意思是dp[i][j]等于前一个加下一个位置放上所有可能的勾码。

#include <iostream>
#include <string.h>
using namespace std;
int dp[21][12001];
int main()
{
int n, m, i, j, k;
int c[21], g[21];
while(cin>>n>>m)
{
memset(dp, 0, sizeof(dp));
for(i=1; i<=n; i++)
{
cin>>c[i];
}
for(i=1; i<=m; i++)
{
cin>>g[i];
}
dp[0][6000]=1;//一个勾码也不放时,处于平衡状态
for(i=1; i<=m; i++)//每放一个勾码时,访问寻找已经达到平衡的一个点,并且让这个位置放一遍所有的勾码,即:dp[i][j]=sum(c[i]*g[k]);
{
for(j=0; j<=12000; j++)
if(dp[i-1][j])
{
for(k=1; k<=n; k++)
{
dp[i][j+c[k]*g[i]]+=dp[i-1][j];
}
}
}
cout<<dp[m][6000]<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: