生活随笔
收集整理的這篇文章主要介紹了
【币值最大化问题】
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【幣值最大化問(wèn)題】
- 1. 問(wèn)題描述
- 2. 解決方案 --- 動(dòng)態(tài)規(guī)劃
1. 問(wèn)題描述
給定一排n個(gè)硬幣,其面值均為正整數(shù)c1,c2,…,cn,這些整數(shù)并不一定兩兩不同。請(qǐng)問(wèn)如何選擇硬幣,使得在其原始位置互不相鄰的條件下,所選硬幣的總金額最大。
2. 解決方案 — 動(dòng)態(tài)規(guī)劃
- 解題思路:
我們可以將問(wèn)題劃分為取最后一枚硬幣和不取最后一枚硬幣。根據(jù)不相鄰這一條件,若取最后一枚硬幣,則我們繼續(xù)判斷前n-2枚硬幣中的幣值總和最大問(wèn)題;若不取最后一枚,則我們繼續(xù)判斷前n-1枚硬幣中的幣值總和最大問(wèn)題。
f[0]=0;
f[1]=arr[1];
f[n]=max(f[n-2]+arr[n],f[n-1]);
f[n]: 有n個(gè)硬幣時(shí)幣值總和最大值。
#include <iostream>
#include <algorithm>
using namespace std
;
int main()
{int n
;cout
<< "請(qǐng)輸入硬幣的總數(shù)(n):";cin
>> n
;int *arr
= (int *)malloc((n
+ 1) * sizeof(int));for (int i
= 1; i
<= n
; i
++){cin
>> arr
[i
];}int *f
= (int *)malloc((n
+ 1) * sizeof(int));f
[0] = 0;f
[1] = arr
[1];for (int i
= 2; i
<= n
; i
++){f
[i
] = max(f
[i
- 2] + arr
[i
], f
[i
- 1]);}cout
<< "總金額最大為:";cout
<< f
[n
] << endl
;cout
<< "分別是:" << endl
;int *arr2
= (int *)malloc((n
+ 1) * sizeof(int));int num
= 0;for (int i
= n
; i
>= 1; i
--){if (f
[i
] == f
[i
- 1]){arr2
[num
++] = arr
[--i
];}else{arr2
[num
++] = arr
[i
--];}}sort(arr2
, arr2
+ num
);for (int i
= 0; i
< num
; i
++){cout
<< arr2
[i
] << " ";}cout
<< endl
;return 0;
}
運(yùn)行結(jié)果如下:
總結(jié)
以上是生活随笔為你收集整理的【币值最大化问题】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。