user-0 提问: 新人求大神帮忙，n个球放入m个箱子问题，要列举所有情况

回复:
user: user-1
content: 有个算法，效率很高的，如果求多于盒子，就是先给每个盒子放一个，等等，这是有名的放苹果，具体看链接 http://www.cnblogs.com/dongsheng/archive/2012/08/15/2640468.html

user: user-2
content: 仅供参考//qplw.cpp #include <stdio.h> #include <string.h> #include <stdlib.h> int v=0; int w=0; int m;//记录字符串长度 int n;//记录字符串中的字符种类数 char map[256];//记录是哪几种字符 int count[256];//记录每种字符有多少个 int stack[1000];//递归用的栈，并记录当前生成的排列 void Make_Map(char *str) {//统计字符串的相关信息     int s[256];     int i;     memset(s,0,sizeof(s));     memset(count,0,sizeof(count));     m=strlen(str);     if (w<1 || m<w) w=m;     while(*str) {         s[*str]++;         str++;     }     n=0;     for (i=0;i<256;i++)         if (s[i]) {             map[n]=i;             count[n]=s[i];             n++;         } } void Find(int depth) {//递归式回溯法生成全排列     if (depth==w) {         int i;         for (i=0;i<depth;i++) putchar(map[stack[i]]);         putchar('\n');     } else {         int i;         if (v && depth>0) {             for (i=0;i<depth;i++) putchar(map[stack[i]]);             putchar('\n');         }         for (i=0;i<n;i++)             if (count[i]) {                 stack[depth]=i;                 count[i]--;                 Find(depth+1);                 count[i]++;             }     } } void main(int argc,char**argv) {     if (argc<2) {         printf("%s 要产生全排列的字符串 [限定长度|-1]\n",argv[0]);         return;     }     if (argc>=3) w=atoi(argv[2]);     if (-1==w) v=1;     Make_Map(argv[1]);     Find(0); } //C:\test>qplw //qplw 要产生全排列的字符串 [限定长度|-1] // //C:\test>qplw 123 //123 //132 //213 //231 //312 //321 // //C:\test>qplw 123 2 //12 //13 //21 //23 //31 //32 // //C:\test>qplw 122333 3 //122 //123 //132 //133 //212 //213 //221 //223 //231 //232 //233 //312 //313 //321 //322 //323 //331 //332 //333 // //C:\test>qplw 123 -1 //1 //12 //123 //13 //132 //2 //21 //213 //23 //231 //3 //31 //312 //32 //321 //

user: user-0
content: 引用 4 楼 lovebeyondcxd 的回复:[quote=引用 3 楼 user-3 的回复:] [quote=引用 2 楼 user-3 的回复:] [quote=引用 1 楼 user-3 的回复:] 递归来做。  putKthBall(int m[] , n , k) {     if(k == n)               return;     for(int i = 0 ; i < m ; i++ )     {               putKthBall(int m[] , n , k+1);     } }    可能有些错误，每当 k == n 的时候，可以退出循环，此时应该把所有的球放完了，这个时候打印当前放的情况就可以了。[/quote]  我这里所说的错误是 m 不是数组，而是 数字，多少个箱子。[/quote]  非常感谢！！我还是不太理解，输入变量中的数组m[ ]的含义是？还有递归过程中球的数量如何增加？[/quote] 说错了，是怎么增加某个箱子中的球，每次完整递归完输出一种情况？

user: user-0
content: 引用 3 楼 user-3 的回复:[quote=引用 2 楼 user-3 的回复:] [quote=引用 1 楼 user-3 的回复:] 递归来做。  putKthBall(int m[] , n , k) {     if(k == n)               return;     for(int i = 0 ; i < m ; i++ )     {               putKthBall(int m[] , n , k+1);     } }    可能有些错误，每当 k == n 的时候，可以退出循环，此时应该把所有的球放完了，这个时候打印当前放的情况就可以了。[/quote]  我这里所说的错误是 m 不是数组，而是 数字，多少个箱子。[/quote]  非常感谢！！我还是不太理解，输入变量中的数组m[ ]的含义是？还有递归过程中球的数量如何增加？

user: user-3
content: 引用 2 楼 user-3 的回复:[quote=引用 1 楼 user-3 的回复:] 递归来做。  putKthBall(int m[] , n , k) {     if(k == n)               return;     for(int i = 0 ; i < m ; i++ )     {               putKthBall(int m[] , n , k+1);     } }    可能有些错误，每当 k == n 的时候，可以退出循环，此时应该把所有的球放完了，这个时候打印当前放的情况就可以了。[/quote]  我这里所说的错误是 m 不是数组，而是 数字，多少个箱子。

user: user-3
content: 引用 1 楼 user-3 的回复:递归来做。  putKthBall(int m[] , n , k) {     if(k == n)               return;     for(int i = 0 ; i < m ; i++ )     {               putKthBall(int m[] , n , k+1);     } }    可能有些错误，每当 k == n 的时候，可以退出循环，此时应该把所有的球放完了，这个时候打印当前放的情况就可以了。

user: user-3
content: 递归来做。  putKthBall(int m[] , n , k) {     if(k == n)               return;     for(int i = 0 ; i < m ; i++ )     {               putKthBall(int m[] , n , k+1);     } }