您的位置:首页 > 其它

2015 多校联赛 ——HDU5389(dp)

2015-08-14 11:28 274 查看
[align=left]Sample Input[/align]

4
3 9 1
1 2 6
3 9 1
2 3 3
5 2 3
1 1 1 1 1
9 9 9
1 2 3 4 5 6 7 8 9

Sample Output

1
0
10
60

题意:

已知有两个门,要求将人分为两组,两组的“和”分别等于两个门的数字,当然也可以全部进入一个门

思路:(NeverMoreH

如果能找到满足题意的解,一定满足a和b的和等于n个人的标号的和,所以我们只需要判断n个人的标号组成a的情况有多少(或者只判断b,一样),同时还要注意可以把n个人都分给a,或者都分给b,这样也是满足的。(果然还是缺乏经验- -,想不到方法)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
#define N 500010
#define mod 258280327

int q[100050];
int dp[100005][10];

int Sum(int x,int y)
{
int temp = x + y;
int ans = temp % 9;
if(ans == 0)
return 9;
return ans;
}

int main()
{
int T,n,a,b;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&a,&b);
int sum = 0;
for(int i = 1; i <= n ; i++)
{
scanf("%d",&q[i]);
sum = Sum(sum,q[i]);
}
memset(dp,0,sizeof(dp));
dp[0][0] = 1;

for(int i = 1; i <= n; i++)
for(int j = 0; j <= 9; j++)
{
dp[i][j]+=dp[i-1][j];
dp[i][Sum(j,q[i])] +=dp[i-1][j];
dp[i][j] %= mod;
dp[i][Sum(j,q[i])] %= mod;
}
int ans = 0;

ans = (ans+dp
[a]) * (Sum(a,b) == sum);

if(sum == a && ans == 0)
ans++;
if(sum == b)
ans++;
printf("%d\n",ans);
}
return 0;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: