今天程式考試受挫,遂打算寒假空閒時間刷刷題,練練手感。
今天有一題是這樣的,檔案"data.txt"有n+1行,每一行都為乙個正整數,第一行為n,剩餘n行為任意n個正整數。對於正整數m(m>=2),輸出m個數的和,要求和不大於100,並列出表示式;並且要求表示式不相同。若表示式中的元素相同則表示式就相同,如「1+2+3」與"2+1+3"相同,"2+2+4+4"與"4+2+2+4"相同。考慮所有可能的m,並且輸出對應m所有的表示式到檔案"output.txt"中。
題目的實質是子集和問題,給定元素個數為n的集合s,輸出所有子集和小於100的子集。我們已知子集和問題是乙個np完全性問題(參考演算法導論np問題),所以該題目前不存在乙個多項式時間的演算法求解。
求解此問題可以採取遞迴演算法,遞迴函式如下:
void output(vectorin, vectorout,int index)
;ofstream out("output.txt");
vectortemp;
void print(vectorv)
sort(vec.begin(),vec.end());
for(int i=0;i> vecarray;
for(int i=0;i
子集和問題
題目描述 子集和問題的乙個例項為 s,t 其中,s 是乙個正整數的集合,c是乙個正整數。子集和問題判定是否存在s的乙個子集s1,使得s1中的各元素之和等於c。題目出自 計算機演算法設計與分析 第3版 王曉東 思路 用回溯法解這道題,我本來想修改排列樹使之可以求出乙個集合的所有子集。但是分析了一下,時...
子集和問題
問題描述 子集和問題的乙個實力為。其中,s 是乙個正整數的集合,c是乙個正整數。判定是否存在s的乙個子集s1使得s1的和為c。輸入 輸入含多組測試用例!對每組測試用例,第一行有兩個正整數n和c,n表示s的大小,c是子集和的目標值。接下來的一行,有n個正整數 1 n 10000 表示集合s中的元素。當...
子集和問題
問題描述 給定乙個集合和乙個正整數c,判定是否存在該集和的子集,使其所有元素的和等於給定的正整數c?思路 利用二進位制,設集和中的某個數,0代表該數沒被選中,1代表該數被選中。則長度為n的集和,有2 n種選擇。通過for迴圈從0到n 1,集和中被選中的數相加,結果與正整數c相等,輸出該子集和。inc...