採用動態規劃求解。思路同本文中前面的程式設計題——跳石板。建立乙個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 個蘋果 輸出描述 輸出乙個整數表示最少...