程式基本演算法習題解析 子集和問題

2021-09-05 09:48:19 字數 1113 閱讀 8695

題目

子集和問題。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...