網易買蘋果

2021-08-19 02:14:21 字數 1958 閱讀 1720

採用動態規劃求解。思路同本文中前面的程式設計題——跳石板。建立乙個vector容器steps,steps[i]表示購買i個蘋果所需的最小袋數。初始化為steps容器為int_max。從1蘋果開始遍歷,若steps[i]為int_max,表示無法購買該個數的蘋果,直接開始下次迴圈。若steps[i]不為int_max,表示該個數的蘋果可以購買,進行動態規劃求解。動態規劃的轉移方程為

steps[i+j] = min(steps[i]+1,steps[i+j])   //j為6或8

steps[0] = 0

動態規劃的過程如下圖所示。

可以理解一下貪婪演算法,就是每次選擇最好的,如果剩下空間不夠最好的,再去用下一等來填充,如果超標,就把最好的減一,,進行回溯

對於金額,優先選取每袋含有8個蘋果的包裝。若還有餘數,則再用6個裝的包裝去購買。如果不行的話,則將8個裝的個數減去1個,進行回溯,再用6包裝的去購買。如果還不行的話,再次回溯,直到購買8包裝的個數為0。

貪婪演算法並不一定能得到最優解,但是乙個可行的,較好的解。下面對使用貪婪演算法能否得到最優解進行分析。

首先,6和8都是偶數。因此,能湊出的個數也一定是偶數。程式中若蘋果總數是奇數,可以直接返回-1。

再次,偶數個蘋果數對8取模,其結果只可能為0,2,4,6。若餘數為6或者0,則可以直接用6包裝情況處理,不需要回溯購買8包裝的情況。若餘數為4,只需回溯1次即可,因為8+4=12, 12%6 = 0。若餘數為2,只需回溯2次即可,因為8+8+2=18, 18%6 = 0。

綜上,本題情況使用貪婪演算法一定能得到最優解。

貪婪演算法並不一定能得到最優解,但是乙個可行的,較好的解。例如,給定硬幣coins=[1,2,10,25],金額總數amounts=30,不限制每種幣值的硬幣數量,要求用所給硬幣湊出所需金額,並且硬幣數量最少。若採用貪婪演算法求解,需要6枚(25+5*1)硬幣。 若採用動態規劃求解,所需3枚(10+10+10)硬幣。 --- 貪婪演算法

對數字特徵進行分析。

首先,6和8都是偶數。因此,能湊出的個數也一定是偶數。程式中若蘋果總數是奇數,可以直接返回-1。

再次,偶數個蘋果數對8取模,其結果只可能為0,2,4,6。若餘數為6或者0,則可以直接用6包裝情況處理,不需要回溯購買8包裝的情況。若餘數為4,只需回溯1次即可,因為8+4=12, 12%6 = 0。若餘數為2,只需回溯2次即可,因為8+8+2=18, 18%6 = 0。

綜上,可以採用如下思路進行處理。(由於數字6和8的特徵,本方法只適用於本題

#include #include #include #include using namespace std;

int main()

else

if(i+8 <= amounts)}}

steps[amounts] = (steps[amounts] == int_max)? -1:steps[amounts];

cout

int maxpackages(int num)

if (num % 8 == 0)

else

else }}

return -1;

}int main()

return 0;

}

#include using namespace std;

int main()

else

else}}

return 0;

}

網易 分蘋果

n 只奶牛坐在一排,每個奶牛擁有 ai 個蘋果,現在你要在它們之間轉移蘋果,使得最後所有奶牛擁有的蘋果數都相同,每一次,你只能從乙隻奶牛身上拿走恰好兩個蘋果到另乙個奶牛上,問最少需要移動多少次可以平分蘋果,如果方案不存在輸出 1。每個輸入包含乙個測試用例。每個測試用例的第一行包含乙個整數 n 1 n...

程式設計題 買蘋果

小易去附近的商店買蘋果,奸詐的商販使用了 交易,只提供6個每袋和8個每袋的包裝 包裝不可拆分 可是小易現在只想購買恰好n個蘋果,小易想購買盡量少的袋數方便攜帶。如果不能購買恰好n個蘋果,小易將不會購買。輸入描述 輸入乙個整數n,表示小易想購買n 1 n 100 個蘋果 輸出描述 輸出乙個整數表示最少...

程式設計題 買蘋果

小易去附近的商店買蘋果,奸詐的商販使用了 交易,只提供6個每袋和8個每袋的包裝 包裝不可拆分 可是小易現在只想購買恰好n個蘋果,小易想購買盡量少的袋數方便攜帶。如果不能購買恰好n個蘋果,小易將不會購買。輸入描述 輸入乙個整數n,表示小易想購買n 1 n 100 個蘋果 輸出描述 輸出乙個整數表示最少...