有K种颜色的小球(K<=10),每种小球有若干个,总数小于100个。
现在有一个小盒子,能放N个小球(N<=8),现在要从这些小球里挑出N个小球,放满盒子。
想知道有哪些挑选方式。注:每种颜色的小球之间没有差别。
请按数字递增顺序输出挑选小球的所有方式。
如有3种颜色,每种颜色小球的个数分别为a:1,b:2,c:3,挑出3个小球的挑法有:
003,012,021,102,111,120
#include<algorithm>
#include<string.h>
#include<string>
#include<vector>
#include<stack>
#include<numeric>
using namespace std;
struct node
{
int num;
vector< vector<int> > v;//两个容器嵌套,记录取球方案
};
int main()
{
int n, k;
cin >> k >> n;
vector<node> ball(k);
for (int i = 0; i < k; i++)
{
int t;
cin >> t;
ball[i].num = t;
}
if (k == 1)//只有一种方案
cout << n << endl;
else
{
vector<int>temp;
for (int i = 0; i <= ball[0].num; i++)//初始化,第一种球的取法
{
temp.push_back(i);
ball[0].v.push_back(temp);
temp.clear();
}
for (int i = 1; i < k; i++)//取那种球
{
for (int j = 0; j < ball[i - 1].v.size(); j++)//取第i种球之前有几种方案
{
for (int x = 0; x <= ball[i].num; x++)//第i种球可以取多少个
{
temp = ball[i - 1].v[j];//取第i-1种球的第j种方案
temp.push_back(x);//第i种球取x个
if (i == k - 1)//取完K种球并且球的总数为N(k-1是因为第一种球初始化处理了)
{
if (accumulate(temp.begin(), temp.end(),0) == n)//输出方案
{
for (int y = 0; y < temp.size(); y++)
cout << temp[y];
cout << endl;
}
}
else
if (accumulate(temp.begin(), temp.end(),0) <= n)
ball[i].v.push_back(temp);//取完第i种球之后的取球方案
temp.clear();
}
}
}
}
return 0;
}
知识兔