我們有兩個儲物柜,稱為L1和L2,里面有一些硬幣。L1有A個硬幣,L2有B個硬幣。我們必須從儲物柜中取出硬幣,使得取出的金額最大化。每次從任何一個儲物柜中取出硬幣時,都會用前一個數量減1個硬幣替換。如果我們從L1中取出A個硬幣,那么它將被A-1個硬幣替換,如果我們從L2中取出B個硬幣,那么它將被B-1個硬幣替換。任務是在兩個步驟中最大化取出的金額。這意味著硬幣只能被取出兩次。
輸入 – L1 – 10,L2 – 11
輸出 – 可以在兩個步驟中取出的最大金額 – 21
解釋 – 在第一步中,我們從L2中取出11個硬幣,L2將被11-1=10個硬幣替換。
在第二步中,L1和L2都有10個硬幣,所以可以從任何一個中取出,我們有11+10=21個硬幣,這是最大的。
輸入 – L1-5,L2-5
輸出 – 可以在兩個步驟中取出的最大金額 – 10
解釋 – 在第一步中,我們從L1中取出5個硬幣,L1將被5-1=4個硬幣替換。
在第二步中,L1有4個硬幣,L2有5個硬幣,所以我們從L2中取出5個硬幣,我們有5+5=10個硬幣,這是最大的。
以下程序使用的方法如下
我們有兩個整數型儲物柜L1和L2,其中有一些硬幣。
函數maxMoney(int A, int B)以儲物柜中的硬幣數量作為輸入。
在maxMoney()函數中,我們使用變量’money’來存儲最大金額。
最初,money的值來自A或B中較大的一個。(money=A>B?A:B)
將money的值與A或B進行比較,以確定哪個容器的硬幣被取出。
現在用前一個數量減1個硬幣來替換該容器。(A–或B–)
再次將money的值加上A或B中較大的一個。(money+=A>B?A:B)
如果k較小,則最小的k個元素的和最小 –
在D1中存儲abs((整個數組的和) – (最小的k個元素的兩倍和)). 兩倍是因為數組和也包含了這些元素。
如果k較大,則最大的k個元素的和最大 –
在D2中存儲abs((整個數組的和) – (最大的k個元素的兩倍和)). 兩倍是因為數組和也包含了這些元素。
將D1與D2進行比較,并將最大值存儲在maxD中。
將maxD作為結果返回。
示例
?實時演示
Code: #include <stdio.h> #include <math.h> // Function to return the maximum coins we can get int maxMoney(int A, int B){ //take coins int money=A>B?A:B; //refill the lockers with 1 less no.of coins if(money==A) A--; else B--; //withdraw again money+=A>B?A:B; return money; } // Driver code int main(){ int L1 = 8, L2 = 9; printf("Maximum money that can be withdrawn in two steps: %d" , maxMoney(L1, L2)); return 0; }
登錄后復制
輸出
如果我們運行上面的代碼,它將生成以下輸出?
Maximum money that can be withdrawn in two steps: 17
登錄后復制
以上就是在C中,可以通過兩個步驟最多提取的金額的詳細內容,更多請關注www.xfxf.net其它相關文章!