C程式設計的抽象思維 遞迴過程 砝碼稱重

2021-06-22 02:16:46 字數 1267 閱讀 7090

【問題】

在狄更斯時代,商人們用砝碼和天平來稱量商品的重量,如果你只有幾個砝碼,就只能精確地稱出一定的重量。例如,假定只有兩個砝碼:分別是1kg和3kg。只用1kg的砝碼可以稱出1kg重量的商品,只用3kg的砝碼可以稱出3kg重量的商品。1kg和3kg的砝碼放在天平同一邊可以稱出4kg重量的商品,放在不同邊可以稱出2kg重量的商品。因此利用這兩個砝碼,我們可以稱出重量分別為1、2、3、4kg的商品。

編寫乙個遞迴函式:

bool ismeasurable(int target, int weights, int nweights)
用來確定用一組給定的砝碼能否稱量指定的重量。可用的砝碼用陣列weights表示,nweights表示砝碼的個數。例如前面所講的兩個砝碼的示例可以使用如下的變數表示:

static int sampleweights = ;

static int nsampleweights = 2;

給定之後,呼叫函式:

ismeasurable(2, sampleweights, nsampleweights)

將返回true,因為1kg和3kg的兩個砝碼能夠稱出2kg重量的商品。如果呼叫函式:

ismeasurable(5, sampleweights, nsampleweights)

將返回false, 因為不能用重1kg和3kg的砝碼稱5kg的商品。

【分析】

對這個問題最基本的考慮是能按以下方式中的任何一種使用每乙個砝碼:

1. 能把它放在天平上與商品不同的一邊

2. 能把它放在天平上與商品相同的一邊

3. 能把它移離天平

如果選定砝碼組中的乙個砝碼,並知道如何使用這三個選項中之一來處理後面的問題,那麼就能提出解決這個問題所需的遞迴思想。

【**】

#include #include typedef enumbool;

bool ismeasurable(int target, int weights, int nweights)

else

}int main()

; int nsampleweights = 5;

bool result;

result = ismeasurable(50, sampleweights, nsampleweights);

if(result)

printf("true\n");

else

printf("false\n");

}

C程式設計的抽象思維 遞迴過程 格雷碼

問題 每一對相鄰整數的二進位制表示只有一位發生變化,這種編碼稱為gray碼。如下所示3位的gray碼 0000 0011 0112 0103 1104 1115 1016 1007 要產生n位的gray碼,所需的遞迴思想概括如下 1.寫出n 1位的gray碼。2.以相反的順序在該gray碼下重寫一遍...

C程式設計的抽象思維 遞迴過程 數集分離問題

問題 給定乙個數集,分離問題要求找到其子集,使所有的數相加等於乙個特定的數。例如,有兩種方法可以分離集合,從而使子集中的額元素相加等於5 第一種方法 選1和4 第二種方法 只選5 相比之下,沒有方法分離集合得到11。編寫乙個函式numberofpartitions,它以乙個整數陣列 陣列長度和目標數...

《C程式設計的抽象思維》1 9程式設計練習

1 溫度轉換 includeint main 2 長度轉換 includeint main return0 3 計算1 2 3 100 includeint main 4 計算序列值 includeint main 5 按照指定格式輸入乙個整數序列中的最大值 includeint main prin...