zoukankan      html  css  js  c++  java
  • 盒子与小球之二

    描述

    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
    ",Ways(N,A,B));
        return 0;
    }
  • 相关阅读:
    关于C语言中%p和%X的思考
    multimap员工分组案例
    set容器查找操作使用
    绘制漂亮的思维导图
    [deque容器练习]打分案例
    【LeetCode】1162. 地图分析
    【LeetCode】820. 单词的压缩编码
    【LeetCode】914. 卡牌分组
    【LeetCode】999. 车的可用捕获量
    【LeetCode】3. 无重复字符的最长子串
  • 原文地址:https://www.cnblogs.com/MalcolmMeng/p/9178257.html
Copyright © 2011-2022 走看看