題目:
子集和問題。s=是乙個正整數的集合,c是乙個正整數。是否存在s的乙個子集s1,使得s1中的各元素之和等於c。
思路:
首先進行全部元素的求和,如果該和小於給定正整數c,則判定為無解;
在有解的基礎上,對s從大到小排序,刪除掉比給定正整數大的元素,重新組合成乙個子集subs,減少程式執行時間。
然後根據子集中元素個數進行嘗試,暫定子集中有乙個元素,遍歷一遍;若不滿足要求,則將子集增加乙個元素,遍歷一遍;...直到找到正確的子集。
**如下:
// 子集和問題
// s=是乙個正整數的集合,c是乙個正整數。
// 是否存在s的乙個子集s1,使得s1中的各元素之和等於c。
#include "stdafx.h"
#includeusing namespace std;
const int max = 100;
int result[100]; //所求的子集
//從大到小排序
void funsort(int *arr,int n)
//交換陣列元素位置
void funswap(int *a,int *b)
//求子集
//arr:陣列,n:陣列元素個數,c:給定整數
//src:正整數集,level:第幾層(子集中的元素個數為level+1),n:正整數集中元素個數,c:給定的正整數
void getsubset(int *src,int level,int n,int c)
} //子集陣列,排除單個比c大的整數
int subn = n-edge;
int *subs = new int[subn];
for(i=0;i
執行結果如下:
注意的是,該程式只提供了找到一種解的方法,並不能將所有解全部找出。而且當不存在這樣乙個子集時,程式會崩。
演算法 子集和問題
子集和問題就是 給出乙個陣列arr和乙個值sum 輸出滿足和為sum的arr的子集 子集和問題 從某種程度上來說 其實就是 01揹包問題的 子問題 還是取一種情況 不取是另外一種情況 然後 用回溯法 構建出一棵樹來遍歷一下 include include using namespace std co...
程式開發換教室問題解析
程式開發換教室問題解析 爆搜。暴力列舉要換的教室,計算期望值,不斷更新答案。我寫了兩個dfs函式。第乙個用來列舉換的教室,第二個用來算期望值,寫的很醜,望見諒。得分 80分。233 補充一下遞迴實現指數型列舉的模板。這等價於每個整數可以選或不選,所有可能的方案總數共有2n role presenta...
程式設計開發習題反轉鍊錶問題解析
程式設計開發習題反轉鍊錶問題解析 輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。解 先定義乙個last指標,用來指向phead指標的下乙個結點 然後x0結點應該指向none,也就是phead.next last,它會成為我們反轉之後的最後乙個結點,讓last指向x0 last phead,phead...