輸入兩個整數n和sum,要求從數列1,2,3,…,n中隨意取出幾個數,使得它們的和等於sum,請將其中所有的可能的組合列出來。
這是個01揹包問題。考慮是否取第n個數的策略,問題可以轉化為乙個只與前n-1個數相關的問題,也就是:
(1)如果取第n個數,那麼問題就轉化為「取前n-1個數使得它們的和為sum-n」
(2)如果不取第n個數,那麼問題就轉化為「取前n-1個數使得它們的和為sum」
這種解法思想和之前部落格裡提到的字串組合所用的解法是類似的。
//
// created by huxijie on 17-3-18.
// 尋找和為定值的多個數
#include
#include
using
namespace
std;
void findsumofk(int sum,int n,list
&result)
//相等則說明加上n之後就等於一開始所求的整數
if (sum == n)
cout
}result.push_front(n);
findsumofk(sum - n, n - 1,result); //加上n,這用前n-1個數來填満sum-n
result.pop_front();
findsumofk(sum, n - 1,result); //不放n,則用前n-1個數來填満sum
}void findsumofk(int sum,int n)
int main()
10
9+18+2
7+37+2+1
6+46+3+1
5+4+1
5+3+2
4+3+2+1
process finished with
exit code 0
《程式設計之法》2 2尋找和為定值的兩個數
題目描述 輸入乙個整數陣列和乙個整數,在陣列中查詢一對數,滿足它們的和正好等於輸入的那個整數,並輸出任一一對值。解法一 直接窮舉 雙層迴圈,複雜度為o n 2 include using namespace std void directenum int nums,int n,int len if ...
程式設計之法 2 2 尋找和為定值的兩個數
輸入乙個整數和乙個整數陣列,在陣列中查詢一對數,滿足他們的和正好是輸入的那個整數,如果有多對數的和等於輸入的整數,輸出任意一對即可。例如,如果輸入陣列 1,2,4,5,7,11,15 和整數15,那麼由於4 11 15,因此表明存在兩個數能相加為15。include include include ...
程式設計之法 面試和演算法心得(尋找和為定值的多個數)
輸入兩個整數n和sum,從數列1,2,3.n 中隨意取幾個數,使其和等於sum,要求將其中所有的可能組合列出來。注意到取n,和不取n個區別即可,考慮是否取第n個數的策略,可以轉化為乙個只和前n 1個數相關的問題。尋找和為定值的多個數 public class searchsomesurevalue ...