近期看到有個有趣的問題,我簡稱為“空瓶子換水”問題,這里分兩種情況,一種是有空瓶子,直接換水問題;另一種是知道怎么用空瓶子換水,如果滿足一定數量的人喝水,需要至少買多少瓶問題。
這里假設3個空瓶子可以換1瓶水,那么針對上面的兩個問題,有如下解釋。
1. 有空瓶子,直接換水
對於計算方法,我這里提供兩種,
第一種是比較笨拙的方法,假設有100個空瓶子,那個第一次換的為50,然后喝完再換,知道不能繼續換為止。那么結果為:33+11+4+1=49;
第二種是,有M個空瓶子,N個瓶子可以換一瓶水(不是一瓶問題,要轉換為一瓶問題),那么他可以換的瓶數為小於M/(N-1)的最大整數。針對第一種的情況,小於(100/(3-1))的為49.
2. 滿足M人很水,需要買多少瓶
這里也有兩種方法,和第一種情況有點類似,只是需要先買M瓶,再來換。這里假設滿足100人喝水,需要至少買多少瓶。
第一種方法,窮舉的方法,從估計的某個數開始嘗試,直到找到符合的結果,代碼如下:
#include<stdio.h> int LeastNum(int base, int peopleNum, int begin) { int res=0,temp; int temp_res,exchange; for(int i=begin; i<peopleNum; i++) { temp = i; temp_res = i; while(temp >= base) { exchange = temp / base; temp_res = temp_res + exchange; temp = exchange + temp % base; } if(temp_res >= peopleNum) { res = i; break; } } return res; } void main() { // 商店做活動,3個空瓶可以換一瓶水,100個人同時去買水,請問至少需要買多少瓶水才能保證每個人都有一瓶水喝 int base, peopNum; scanf_s("%d %d",&base, &peopNum); printf("The minimum purchaing count is %d \n",LeastNum(base,peopNum,60)); //我這里從60開始,也可以從1開始 }
第二種方法,和第一種情況第二種方法有些類似,可采用公式(X+(X/(N-1)))=M,這里X為需要購買的瓶數,最后求出的為大於X的最小正整數。正對滿足100人問題,求出結果為66.7,那么最少需要買67瓶。