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