码迷,mamicode.com
首页 > 其他好文 > 详细

盒子放球的DP

时间:2017-05-26 23:18:54      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:cout   names   bsp   type   pac   方案   set   求和   ++   

URAL1114

题目大意:

有N个盒子,有红色和蓝色两种颜色的球。红球有A个,篮球有B个。现在随意的向盒子里放球,

每个盒子可以放一种颜色的球,也可以放两种颜色的球,也可以不放球。球不必全都放进盒子里。问:总共有多少种方法。

状态dp[i][j][k] 表示向i个盒子里放j个篮球和k个红球的方案数目

状态转移方程:dp[i][j][k]=对dp[i-1][jj][kk] (0<=jj<=j,0<=kk<=k) 求和

  最终结果是:在n个盒子里放  不定数目的球的种类数和即   对dp[n][i][j](0<=i<=A,0<=j<=B)求和。

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int n,a,b;
typedef unsigned long long ull;
//前 i 个 盒子里放 j 个a   k 个b 的方案数
ull dp[25][25][25],fin;
int main()
{
    while(scanf("%d%d%d",&n,&a,&b)!=EOF)
    {
        memset(dp,0,sizeof(dp));
        dp[0][0][0]=1;          //d p[0][a][b]=1;
        fin=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=0;jj<=j;jj++)    //j j=j
                        for(int kk=0;kk<=k;kk++)
                            dp[i][j][k]+=dp[i-1][jj][kk];
                    if(i==n) fin+=dp[i][j][k];              //fin+=
                }

        cout<<fin<<endl;
    }
    return 0;
}

  

盒子放球的DP

标签:cout   names   bsp   type   pac   方案   set   求和   ++   

原文地址:http://www.cnblogs.com/star-and-me/p/6910429.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!