空瓶子換水問題


近期看到有個有趣的問題,我簡稱為“空瓶子換水”問題,這里分兩種情況,一種是有空瓶子,直接換水問題;另一種是知道怎么用空瓶子換水,如果滿足一定數量的人喝水,需要至少買多少瓶問題。

這里假設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瓶。

 



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM