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

盒子与小球之二

时间:2018-06-13 16:27:38      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:define   #define   空格   can   蓝球   nbsp   open   main   names   

描述

N个有差别的盒子(1<=N<=20)。你有A个红球和B个蓝球。0 <= A <= 15, 0 <= B <= 15。球除了颜色没有任何区别。你可以将球放进盒子。一个盒子可以同时放进两种球,也可以只放一种,也可以空着。球不必全部放入盒子中。编程计算有多少种放置球的方法。 

输入

就一行,N,A,B,用空格分开

输出

就一行,输出放置方案总数

样例输入
2 1 1
样例输出
9

查看

思路在代码注释中,很明显要用到分类,另外就是要用 long long

#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<map>
#include<cstring>
#define DEBUG(x) cout << #x << " = " << x << endl
typedef long long ll;
using namespace std;
int N,A,B;
ll ways[25][20][20];
///将a个红球和b个蓝球放入前i个盒子中的放法
ll Ways(int i,int a,int b)
{
    ll t=ways[i][a][b];
    if(t!=-1)return t;
    if(i==0)return 1;
    if(a==0&&b==0)return 1;
    ll r;
    ///不放
    r=Ways(i-1,a,b);
    ///放一种
    for(int k=1;k<=a;k++){
        r+=Ways(i-1,a-k,b);
    }
    for(int k=1;k<=b;k++){
        r+=Ways(i-1,a,b-k);
    }
    ///放两种
    for(int p=1;p<=a;p++){
        for(int q=1;q<=b;q++){
            r+=Ways(i-1,a-p,b-q);
        }
    }
//    DEBUG(r);
    ways[i][a][b]=r;
    return r;
}
int main()
{
//    freopen("in.txt","r",stdin);
    memset(ways,0xff,sizeof(ways));
    scanf("%d %d %d",&N,&A,&B);
    printf("%lld\n",Ways(N,A,B));
    return 0;
}

 

盒子与小球之二

标签:define   #define   空格   can   蓝球   nbsp   open   main   names   

原文地址:https://www.cnblogs.com/MalcolmMeng/p/9178257.html

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