标签: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