标签:
题目链接:
http://acm.timus.ru/problem.aspx?space=1&num=1114
题目大意:
有N个盒子,有红色和蓝色两种颜色的球。红球有A个,篮球有B个。现在随意的向盒子里放球,
每个盒子可以放一种颜色的球,也可以放两种颜色的球,也可以不放球。问:总共有多少种方法。
解题思路:
用DP来做。设dp[i][j][k]表示到第i个盒子为止,用了j个红球和k个篮球。
则dp[i][j][k] = Σ(dp[i-1][jj][kk])(j <= jj <= A,k <= kk <= B)。
则最终结果为Σdp[N][j][k](0 <= j <= A,0 <= k <= B)。
注意:这题long long都不够,需要用unsigned long long。
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define LL unsigned long long
//define LL long long 不可以
using namespace std;
LL dp[25][25][25];
int main()
{
int N,A,B;
while(~scanf("%d%d%d",&N,&A,&B))
{
memset(dp,0,sizeof(dp));
dp[0][A][B] = 1;
LL ans = 0;
for(int i = 1; i <= N; ++i)
{
for(int j = 0; j <= A; ++j)
{
for(int k = 0; k <= B; ++k)
{
for(int jj = j; jj <= A; ++jj)
for(int kk = k; kk <= B; ++kk)
dp[i][j][k] += dp[i-1][jj][kk];
if(i == N)
ans += dp[i][j][k];
}
}
}
printf("%I64u\n",ans);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/lianai911/article/details/47667693