流浪的枫之羽
日历
网志分类
· 所有网志 (43)
· C++学习 (7)
· .net学习 (0)
· 计算机图形学 (4)
· GIS (4)
· Win32平台开发 (10)
· 浙大CS之梦 (4)
· P2P (2)
· 搜索引擎 (4)
· 游戏开发 (0)
· 博客生活 (7)
· 未分类 (1)
站内搜索
友情链接
· 歪酷博客
· 我的歪酷 非非共享界
· 葡萄是一种水果,很好吃哦!
· 可爱的小蓓
· 上帝保佑善良的小孩
· DOOMIII队友
· 我写的小东西

订阅 RSS

0010803

歪酷博客

搜索、游戏、IT,博客、广告、生活
« 上一篇: 第32届ACM亚洲预赛蓉城赛区传来捷报 我校学生摘取金牌 下一篇: DBF文件格式 »
枫之羽 @ 2007-11-26 22:31

今天在群里师兄发了一道公务员试题:4个球放入8个编号不同的盒子,每个盒子可放0-4个,则有几种放法?
我们可以进行推广,就是m个球放入n个编号不同的盒子,每个盒子可放0-m个,则有几种放法?
解题思路1:
用递归:
1个盒子,m个球:1种方法
2个盒子,m个球:分别有(0,m)   (1,m-1)   (2,m-2)...(4,0)   共m+1种方法
设n个盒子,m个球有f(n,m)种放置方法,现取第1个盒子的球数分别为0,1,2,.,i,..m   ,对于这m+1种情况中的第i种情况,有f(n-1,m-i)个含n-1个元素的字符串数组
全部拼起来即可
 
解题思路2:
/*这其实是一个n进制数的问题
假定存在一个m位的n进制数,他的k位上的数字表示第k个球所在盒子的编号,可以证明这个m位的n进制数和盒子的排列是一一对应的 我们知道,对于这种题目,可能的组合数为n^m,那么你只要把0- >n^m-1的数转换成n进制数,再检查对应的每位数既可知道每个球所在的盒子 所以唯一的难点就是整数转换成n进制数的问题,这个好像不是难题哦,学过计组的都应该知道除余法 也就是对于整数x,   x%n表示n进制数个位上的数字,要求更高位的数字,要用x=   x/n迭代*/
递归的程序实现:
#include <cstdlib>
#include <iostream>
using namespace std;
int   *a;
int   n;
int cnt =0;
void  f( int len, int sum ){
      int  i;
      if( sum==0 ){
          for( i=0; i<len; ++i )
               cout<<a[i]<<" ";
          for( ; i<n; ++i )
               cout<<0<<" ";
          cout<<endl;
    cnt++;
          return;
      }
      if( len==n-1 )
   {
          a[len]=sum;
          for( i=0; i<=len; ++i )
               cout<<a[i]<<" ";
          cout<<endl;
     cnt++;
          return;
      }
      for( i=0; i<=sum; ++i ){
           a[len]=i;
           f( len+1, sum-i );
      }
}
int main( )
{
    int  m;
   while(cin>>m>>n)
   {
 cnt = 0;
    a=new int[n];
    f( 0, m );
 cout<<cnt<<endl;
    delete a;
   }
    return 0;
}




评论 / 个人网页 / 扔小纸条
* 昵称

已经注册过? 请登录

新用户请先注册 以便能显示头像及追踪评论回复

Email
网址
* 评论
表情
 


 

分类小组论坛
杂谈 , 娱乐、八卦 , 文学、艺术 , 体育 , 旅游、同城 , 象牙塔 , 情感 , 时尚、生活 , 星座 , 科技

请注意遵守中华人民共和国法律法规, 如威胁到本站生存, 将依法向有关部门报告, 同时本站的相关记录可能成为对您不利的证据.

相关法律法规
全国人大常委会关于维护互联网安全的决定
中华人民共和国计算机信息系统安全保护条例
中华人民共和国计算机信息网络国际联网管理暂行规定
计算机信息网络国际联网安全保护管理办法
计算机信息系统国际联网保密管理规定