取1分2分5分共10玫硬币,组成1角8分共有多少种,c语言

如题所述

第1个回答  2021-01-17

我写了一个小时,你不采纳对不起我


#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";

}

}


}

结果

相似回答