子集和問題的例項為S,t。其中,Sx1,x2

2021-08-25 03:57:32 字數 1846 閱讀 3476

1樓:樂觀的l無謂

給定n 個整數的集合x=和一個正整數y,編寫一個回溯演算法,在x中尋找子集yi,使得yi中元素之和等於y。

#include #include

int len; // 輸入長度.

int sum; // 和.

int *data; // 資料.

char *output; // 所求子集元素,與輸入資料對應,'y'為取.

// 獲取輸入.

void getinput(){

int i;

printf("輸入集合個數: ");

scanf("%d", &len);

while(len <= 0){

printf("集合個數必須大於0: ");

scanf("%d", &len);

data = new int[len];

output = new char[len];

for(i = 0; i < len; i++){printf("輸入第%d個數: ", i+1);

scanf("%d", &data[i]);

output[i] = 'n';

printf("輸入子集和: ");

scanf("%d", &sum);

while(sum <= 0){

printf("子集和必須大於0: ");

scanf("%d", &len);

// 回朔求解:有解返回非0值,無解返回0.

int getres(){

int p = 0; // 指向當前值.

int temp = 0; // 當前子集合和.

while(p >= 0){

if('n' == output[p]){// 選中當前項.

output[p] = 'y';

temp += data[p];

if(temp == sum){

return 1;

else if(temp > sum){

output[p] = 'n';

temp -= data[p];

p++;

if(p >= len){

// 開始回朔.

while('y' == output[p-1]){p--;

output[p] = 'n';

temp -= data[p];

if(p < 1){

return 0;

while('n' == output[p-1]){p--;

if(p < 1){

return 0;

output[p-1] = 'n';

temp -= data[p-1];

return 0;

// 列印結果.

void printres(){

int i;

printf("\r\n所求子集為: ");

for(i = 0; i < len; i++){if('y' == output[i]){printf("%d ", data[i]);

void main(){

getinput();

if(getres()){

printres();

else{

printf("無解!");

printf("\r\npress any key to continue.");

getch();

2樓:5555起名好難啊

對於給定的正整數的集合s=和正整數c,計算s 的一個子集s1,使得s1中元素和為c

3樓:匿名使用者

集合是集合,整數是整數,兩碼事。

函式M 2 D0,1,其中2 D為D的所有子集,那個箭頭什麼意思?這個公式具體舉個例項

箭號是屬於的意思,即前面提到的函式包括子集的定義域都在 0,1 中 我不太理解你 其中2 d為d的所有子集 這句話的意思因此舉例不了 2 d 1 1 2 d 21 4 怎麼解?設2 d a 用等比數列求和公式的話,出現一元三次方程 4 4a 3 21a 2 21a 0 設2 d a a 0 則 a ...

設樹T的度為4,其中度為1,2,3,和4的結點個數分別為

每條邊對應乙個節點,只有根節點沒有相應的邊。所以 節點個數 m 邊數 n 1 乙個回度為4的節點對答應有4條出邊,乙個度為3的節點對應有3條出邊,乙個度為2的節點對應有2條出邊,乙個度為1的節點對應有條出邊,葉子節點沒有出邊。所以 邊數 n 1 4 2 2 3 1 4 1 所有節點的度之和 15根據...

連續自然數的和為12928,則其中自然數是多

首先求正中間的乙個數是 12928 101 128,然後求出第乙個數是 128 50 101 2 50 78,最後求第30個數是 78 30 1 107 所以第30個自然數是107。舉例 1 2 3 4 5 6 7 8 9 10 11 66,也就是11個連續自然數的和為55,則其中第6個數是 66 ...