还是动态规划。XDOJ Problem 1144

本文介绍了一个关于围棋棋子分配的数学问题,并提供了一段C语言实现的代码,该问题探讨了如何将n个黑色棋子放入m个相同的盒子中的不同方法的数量。
Description
嗯,首先是故事预告:小学六年级的进藤光为了赚些零用钱,跑到爷爷家里寻宝,偶然翻出了一个旧棋盘。接触棋盘的一瞬间,附身于棋盘中的平安时代棋士——藤原佐为的灵魂进入了小光的体内。佐为将围棋视为生命,在他的熏陶下,小光也逐渐对围棋产生了兴趣……
个人认为围棋中最为枯燥乏味的莫过于整理棋子,比如现在光所要做的工作。先有n个黑色的棋子,m个一样的盒子,问:光有多少种不同的方法,可以将棋子全部放到盒子中去??
 

 

 
Input
每一行有一个m和n(1<m<=n<1000)
Output
每一行输出一个可能的个数(模10007取余)
Sample Input
2 4
1 5
Sample Output
3
1
Hint
Source
SnowWind
   
#include <stdio.h>
#include <stdlib.h>
#define div 10007
int ans[1010][1010]={0};
/*======================
可以分为两种情况:
1  全部的盒子里的棋子个数都不为0;
相当于先分配给每个盒子一球后,再分配。ans[i][j-i];
2 至少有一个盒子里的棋子为0;那前面的i-1个盒子分配
j个球。
状态方程 ans[i][j]=ans[i-1][j]+ans[i][j-i]
=========================*/
int main()
{
    int i,j;
    int m,n;
    for(i=1;i<=1000;i++)
    {
        ans[1][i]=1;
        ans[i][0]=1;
        for(j=1;j<=1000;j++)
        {
            if(j<i)
            {
                ans[i][j]=ans[j][j]%div;
            }
            else
            {
                ans[i][j]=(ans[i-1][j]+ans[i][j-i])%div;
            }
        }
    }
    while(scanf("%d %d",&m,&n)!=EOF)
    {
        printf("%d\n",ans[m][n]%div);
    }
        return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值