标签:des style blog class code tar
题目链接:
http://acm.timus.ru/problem.aspx?space=1&num=1114
| input | output |
|---|---|
2 1 1 |
9 |
题目意思:
有n个盒子,有相同的A球a个,相同的B球b个,每个盒子可以不放球可以放多个球,球可以不全放完。求放的种数。
n<=20 a,b<=15
解题思路:
简单计数dp
dp[i][j][k]:表示1~i个盒子中放了j个A球,k个B球的总的种数。
显然dp[i][j][k]=∑(dp[i-1][jj][kk]) (jj<=j,kk<=k)
注意要用usigned long long不然最后一个会超
代码:
//#include<CSpreadSheet.h>
#include<iostream>
#include<cmath>
#include<cstdio>
#include<sstream>
#include<cstdlib>
#include<string>
#include<string.h>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<ctime>
#include<bitset>
#include<cmath>
#define eps 1e-6
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define ll __int64
#define LL long long
#define ull unsigned long long
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#define M 1000000007
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
#define Maxn 22
ull dp[Maxn][Maxn][Maxn];
int n,a,b;
void init()
{
memset(dp,0,sizeof(dp));
dp[0][0][0]=1;
for(int i=1;i<=20;i++)
{
for(int j=0;j<=15;j++)
{
for(int k=0;k<=15;k++)
{
for(int jj=0;jj<=j;jj++)
for(int kk=0;kk<=k;kk++)
dp[i][j][k]+=dp[i-1][jj][kk];
}
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
init();
while(~scanf("%d%d%d",&n,&a,&b))
{
//printf("%I64d\n",dp[n][a][b]);
ll ans=0;
for(int i=0;i<=a;i++)
for(int j=0;j<=b;j++)
ans+=dp[n][i][j];
printf("%I64u\n",ans);
}
return 0;
}
[计数dp] ural 1114. Boxes,布布扣,bubuko.com
标签:des style blog class code tar
原文地址:http://blog.csdn.net/cc_again/article/details/25396929