题目链接:
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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-08 18:19:21