輸入兩個整數n和sum,從數列1,2,3…….n 中隨意取幾個數,使其和等於sum,要求將其中所有的可能組合列出來。
注意到取n,和不取n個區別即可,考慮是否取第n個數的策略,可以轉化為乙個只和前n-1個數相關的問題。
- 如果取第n個數,那麼問題就轉化為「取前n-1個數使得它們的和為sum-n」,對應的**語句就是sumofknumber(sum - n, n - 1);
- 如果不取第n個數,那麼問題就轉化為「取前n-1個數使得他們的和為sum」,對應的**語句為sumofknumber(sum, n - 1)。
list
list1;
void sumofknumber(int sum, int n)
list1.push_front(n); //典型的01揹包問題
sumofknumber(sum - n, n - 1); //「放」n,前n-1個數「填滿」sum-n
list1.pop_front();
sumofknumber(sum, n - 1); //不「放」n,n-1個數「填滿」sum
}
這個問題屬於子集和問題(也是揹包問題)。本程式採用回溯法+剪枝,其中x陣列是解向量,t=∑(1,..,k-1)wi*xi, r=∑(k,..,n)wi,且
本題中w陣列就是(1,2,..,n),所以直接用k代替wk值。
**編寫如下:
//輸入t, r, 嘗試wk
void sumofknumber(int t, int k, int r, int& m, bool& flag, bool* x)
}printf("\n");
}else
// 若不選第k個數,選第k+1個數滿足條件,則遞迴右子樹
if ((t + r - k >= m) && (t + (k + 1) <= m))
}}void search(int& n, int& m)
bool f = false;
sumofknumber(0, 1, sum, m, f, x);
if (!f)
free(x);
}
尋找和為定值的多個數
程式設計求解 輸入兩個整數 n 和 m,從數列1,2,3.n 中 隨意取幾個數,使其和等於 m 要求將其中所有的可能組合列出來。include includeusing namespace std 全域性變數 listlist1 從1,2.n找到和為sum的數字 void find factor i...
github july 尋找和為定值的多個數
輸入兩個整數n和sum,從數列1,2,3.n 中隨意取幾個數,使其和等於sum,要求將其中所有的可能組合列出來。解法 類揹包問題 遞迴問題 可以看出這是關於0 1揹包問題,可以將問題定義為f n,m 從1 n中選擇多個數,使得之和為m 那麼 1 選取n,則剩下從n 1個數中選擇和為m n的數,即求f...
演算法 尋找和為定值的多個數
2010 年中興面試題 程式設計求解 輸入兩個整數n 和m,從數列1,2,3.n 中隨意取幾個數,使其和等於m 要求將其中所有的可能組合列出來。邏輯分析 2 問題其實本質上就是0 1揹包問題,對於每乙個n,我們採用貪婪策略,先考察是否取n,如果取n,那麼子問題就變成了find n 1,m n 而如果...