【問題】
給定乙個數集,分離問題要求找到其子集,使所有的數相加等於乙個特定的數。例如,有兩種方法可以分離集合,從而使子集中的額元素相加等於5:
第一種方法:選1和4
第二種方法:只選5
相比之下,沒有方法分離集合得到11。
編寫乙個函式numberofpartitions,它以乙個整數陣列、陣列長度和目標數為引數,返回得到的子集元素總和為目標數的分離方式的種類數。例如,假設陣列sampleset定義如下:
int sampleset = ;
對於給定的陣列sampleset,呼叫:
numberofpartitions(sampleset, 4, 5);
將返回值2(有兩種方式可以得到5)。當呼叫:
numberofpartitions(sampleset, 4, 11);
將返回值0(無法得到11)。
numberofpartitions的原型為:
int numberofpartitions(int array, int length, int target);
【分析】
為了弄清楚該問題的遞迴性,先考慮集合中的任何乙個特定元素,比如第乙個元素。如果思考特定目標數的所有可能子集,有些包括第乙個元素,而有些則不包括。如果能計算出包含第乙個元素的自己的數量,並把它加上不包含第乙個元素的子集數,那麼就能得到所有分離方式的數量。然而,這兩種計算方法都可以用乙個與原問題形式向同的問題表示,因此能用遞迴方法得到解答。
【**】
#include #include int numberofpartitions(int arry, int length, int target)
a = numberofpartitions(arry, length - 1, target - arry[length - 1]);//包含元素的子集數
b = numberofpartitions(arry, length - 1, target);//不包含元素的子集數
return (a + b);
}int main()
; int result;
result = numberofpartitions(sampleset, 5, 5);
printf("%d\n", result);
return 0;
}
C程式設計的抽象思維 遞迴過程 砝碼稱重
問題 在狄更斯時代,商人們用砝碼和天平來稱量商品的重量,如果你只有幾個砝碼,就只能精確地稱出一定的重量。例如,假定只有兩個砝碼 分別是1kg和3kg。只用1kg的砝碼可以稱出1kg重量的商品,只用3kg的砝碼可以稱出3kg重量的商品。1kg和3kg的砝碼放在天平同一邊可以稱出4kg重量的商品,放在不...
C程式設計的抽象思維 遞迴過程 格雷碼
問題 每一對相鄰整數的二進位制表示只有一位發生變化,這種編碼稱為gray碼。如下所示3位的gray碼 0000 0011 0112 0103 1104 1115 1016 1007 要產生n位的gray碼,所需的遞迴思想概括如下 1.寫出n 1位的gray碼。2.以相反的順序在該gray碼下重寫一遍...
《C程式設計的抽象思維》1 9程式設計練習
1 溫度轉換 includeint main 2 長度轉換 includeint main return0 3 計算1 2 3 100 includeint main 4 計算序列值 includeint main 5 按照指定格式輸入乙個整數序列中的最大值 includeint main prin...