C++實現 遞迴演算法 - 賞金問題 - 整數因式分解
阿新 • • 發佈:2018-12-20
使用遞迴方法實現以下問題
1.賞金問題
假設有四種面額的錢幣,1 元、2 元、5 元和 10 元,而您一共給我10元,
那您可以獎賞我1張10元,或10張1元,或5張1元外加1張5元等等。
如果考慮每次獎賞的金額和先後順序,那麼最終一共有多少種不同的獎賞方式?
2.整數因式分解問題
使用遞迴方法,為給定整數n,找到所有可能的分解(1在解中最多出現1次)
如:輸入8,輸出是1x8, 8x1, 2x4, 4x2, 1x2x2x2, .....
#include <vector> #include <iostream> #include <algorithm> using namespace std; // 輸出函式 void PrintResult(vector<int> &Result) { for (size_t i = 0; i < Result.size(); ++i) { cout << Result[i] << " "; } cout << endl; } /* 說明: 假設有四種面額的錢幣,1 元、2 元、5 元和 10 元,而您一共給我10元, 那您可以獎賞我1張10元,或10張1元,或5張1元外加1張5元等等。 如果考慮每次獎賞的金額和先後順序,那麼最終一共有多少種不同的獎賞方式? // totalmoney : 總金額 // select : 錢幣面額的選擇列表 // Result : 結果列表 */ void RecursionAlgo(int Totalmoney, vector<int> &Select, vector<int> &Result) { //每次遞迴需要用總金額減去使用的面額,直到Totalmoney=0,表示找到解 if (Totalmoney == 0) { PrintResult(Result); return; } //Totalmoney < 0, 不符合標準 返回 else if (Totalmoney < 0) { return; } else { for (size_t i = 0; i < Select.size(); ++i) { //重要!!!!!!!!!!!!!!!!!!! // 這裡新建vector 用於獲取之前的選擇,並記錄當前的選擇 // 新建vector臨時變數便於清空錯誤的選擇集 vector<int> newResult = Result; newResult.push_back(Select[i]); RecursionAlgo(Totalmoney-Select[i], Select, newResult); } } } //陣列中是否存在某值 bool IsExit(vector<int> &Result, int value) { vector<int>::iterator result = std::find(Result.begin(), Result.end(), value); if (result == Result.end()) { return false; } else { return true; } } /* 整數分解 使用遞迴方法,為給定整數n,找到所有可能的分解(1在解中最多出現1次) 如:輸入8,輸出是1x8, 8x1, 2x4, 4x2, 1x2x2x2, ..... */ void RecursionAlgo(int Num, vector<int> &Result) { if (Num == 1) { PrintResult(Result); return; } for (int i = 1; i <= Num; ++i) { //判斷1是否在解中 if (IsExit(Result, 1)) { if (i == 1) { continue; } } if (Num%i == 0) { vector<int> newResult = Result; newResult.push_back(i); RecursionAlgo(Num/i, newResult); } } } int _tmain(int argc, _TCHAR* argv[]) { int Totalmoney = 10; int ia[] = {1, 2, 5, 10}; vector<int> Select(ia, ia+4); vector<int> Result; // RecursionAlgo(Totalmoney, Select, Result); RecursionAlgo(Totalmoney, Result); return 0; }