例1:币值最大化问题(01背包)
给定一排n个硬币,其面值均为正整数c1,c2,...,cn,这些数并不一定两两相同。请问如何选择硬币,使得在其原始位置互不相邻的条件下,所选的总金额最大。
题解:
对于每一个位置的硬币有且仅有两种选择(拿或者不拿),故对于当前位置可选最大金额为max(cn+F(n-2),F(n-1))。
f[x]=max(c[n]+f[n-2],f[n-1]);
其次注意初始化f[1]=c1与f[0]=0,
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int t, *money,*f;
cin >> t;
money = (int *)malloc(t * sizeof(int));
f = (int *)malloc(t * sizeof(int));
for (int i = 1; i <= t; i++)cin >> money[i];
f[0] = 0;
f[1] = money[1];
for (int i = 2; i <= t; i++) {
f[i] = max(money[i] + f[i - 2], f[i - 1]);
}
cout << f[t];
}