Visualizing this problem, as unique ways to hand out ninja stars to ninjas. This also shows how each larger solution is made up of its neighboring, more simple solutions. ![alt text][1] Here is how to implement it in php: (might help you understand it too) function multichoose($k,$n) { if ($k < 0 || $n < 0) return false; if ($k==0) return array(array_fill(0,$n,0)); if ($n==0) return array(); if ($n==1) return array(array($k)); foreach(multichoose($k,$n-1) as $in){ //Gets from a smaller solution -above as (blue) array_unshift($in,0); //This prepends the array with a 0 -above as (grey) $out[]=$in; } foreach(multichoose($k-1,$n) as $in){ //Gets the next part from a smaller solution too. -above as (red and orange) $in[0]++; //Increments the first row by one -above as (orange) $out[]=$in; } return $out; } print_r(multichoose(3,4)); //How many ways to give three ninja stars to four ninjas? Not optimal code: Its more understandable that way. Our output: (0,0,0,3) (0,0,1,2) (0,0,2,1) (0,0,3,0) (0,1,0,2) (0,1,1,1) (0,1,2,0) (0,2,0,1) (0,2,1,0) (0,3,0,0) (1,0,0,2) (1,0,1,1) (1,0,2,0) (1,1,0,1) (1,1,1,0) (1,2,0,0) (2,0,0,1) (2,0,1,0) (2,1,0,0) (3,0,0,0) Fun use to note: Upc relies upon this exact problem in barcodes. The sum of the whitespace and blackspace for each number is always 7, but is distributed in different ways. //Digit L Pattern R Pattern L\R Pattern (Number of times a bit is repeated) 0 0001101 1110010 2100 1 0011001 1100110 1110 2 0010011 1101100 1011 3 0111101 1000010 0300 4 0100011 1011100 0021 5 0110001 1001110 0120 6 0101111 1010000 0003 7 0111011 1000100 0201 8 0110111 1001000 0102 9 0001011 1110100 2001 Note only 10 of the 20 combinations are used, which means the code can be read upside-down just fine. All 20 can be used however, and are in EAN13, with a bit more complexity. http://en.wikipedia.org/wiki/EAN-13 http://en.wikipedia.org/wiki/Universal_Product_Code http://www.freeimagehosting.net/uploads/58531735d3.png [1]: http://www.freeimagehosting.net/uploads/58531735d3.png