尋找和為定值的多個數

2021-07-05 03:17:03 字數 1098 閱讀 1702

輸入兩個整數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 而如果...