一、币值最大化问题
问题描述:给定一排n个硬币,其面值均为整数c1, c2, …, cn, 这些整数并不一定两两不同。问如何选择硬币,使得在其原始位置互不相邻的条件下,所选硬币的总金额最大。
上述最大可选金额用f(n)表示,我们可以将所有可行的选择划分为两组:包括最后一枚硬币的和不包括最后一枚硬币的。第一组中,可选包含最后一枚硬币的,最大金额为Cn+f(n-2),即最后一枚硬币加上前面n-2枚硬币可选的最大金额。按照f(n)的定义,另一组中可选的最大金额为f(n-1),即前n-1枚硬币的最大金额。
可得出符合初始条件的递推方程:
f(n)=max{Cn+f(n-2),f(n-1)}
f(0)=0,f(1)=c1
#include<iostream>
#include<algorithm>
using namespace std;
const int N=10001;
int main()
{
int n;
int value[N];
int f[N];
memset(value,0,sizeof(value));
memset(f,0,sizeof(f));
cin>>n;
for(int i=1;i<=n;i++)
cin>>value[i];
f[0]=0;
value[0]=0;
f[1]=value[1];
for(int i=2;i<=n;i++){
f[i]