我写了一个小时,你不采纳对不起我
#include <iostream>
#include <vector>
using namespace std;
vector<int> temp;
vector<vector<int>> all;
int TempSum(int Length) //到某个长度的temp和值
{
int sum = 0;
for (int i = 0; i < Length; ++i)
{
sum += temp[i];
}
return sum;
}
void Recursive(int num,int COINS) //递归 拼凑所有组合
{
if (num != 0)
{
temp[num - 1] = COINS - TempSum(num - 1);
}
if (num == 10)
{
if (COINS == 18)
{
all.push_back(temp);
}
return;
}
Recursive(num + 1, 1 + COINS);
Recursive(num + 1, 2 + COINS);
Recursive(num + 1, 5 + COINS);
}
void SortAllEachLine() //所有组合每一行排序
{
for (int i = 0; i < all.size(); ++i)
{
for (int j = 0; j < all[i].size(); ++j)
{
for (int k = 0; k < all[i].size() - j - 1; ++k)
{
if (all[i][k] > all[i][k + 1])
{
int temp = all[i][k];
all[i][k] = all[i][k + 1];
all[i][k + 1] = temp;
}
}
}
}
}
bool JudgeContainerSame(vector<int> one,vector<int> two) //判断容器是否一样
{
for (int i = 0; i < 10; ++i) //都是10个我就不做长度判断了
{
if (one[i] != two[i])
return false;
}
return true;
}
void TakeOutSame() //去掉all所有组合相同的部分,因为排序之后他们之中有些会完全相同
{
for (auto iter1 = all.begin(); iter1 != all.end(); ++iter1)
{
for (auto iter2 = iter1+1; iter2 != all.end(); )
{
if (JudgeContainerSame(*iter1, *iter2))
iter2 = all.erase(iter2);
else
++iter2;
}
}
}
int main()
{
//1,2,5 取10个数 和值为18 有多少种组合
temp.resize(10);
for (int i = 0; i < 10; ++i)
{
temp[i] = 0;
}
Recursive(0, 0); //可以得到所有满足18的组合all 共1350种
//接下来去掉排序不一样 但是 是相同的1 2 5个数的
//思路:先全部排序 排序之后去掉相同的
SortAllEachLine(); //排序
TakeOutSame(); //去掉重复部分
std::cout << "一共有" << all.size() << "组合\n\n它们分别是:\n"; //测试下来是3种
for (int i = 0; i < all.size(); ++i)
{
for (int j = 0; j < all[i].size(); ++j)
{
if (j != all[i].size() - 1)
std::cout << all[i][j] << ",";
else
std::cout << all[i][j] << "\n";
}
}
}