链接:https://www.nowcoder.com/acm/contest/79/A
这天部门活动我没有参加这次比赛,在外面吃饭的时候收到了来自舍友和队友的求助,说题目数据坑。。回宿舍后遂一看究竟。
思路:
一、简单dp(第一反应)
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
double money[30];
double r[4];
double _max(double a,double b){
return a>b?a:b;
}
int main(){
int n = 20;
for(int i = 0;i < 4;i++)cin >> r[i];
money[0] = 1;
for(int i = 0;i <= n;i++){
money[i+1] = _max(money[i+1],money[i]*(1+r[0]));
money[i+2] = _max(money[i+2],money[i]*pow(1+r[1],2));
money[i+3] = _max(money[i+3],money[i]*pow(1+r[2],3));
money[i+5] = _max(money[i+5],money[i]*pow(1+r[3],5));
}
for(int i = 1;i <= 20;i++)
cout << fixed << setprecision(5) << money[i] << endl;
return 0;
}
由money[0]->money[n]更新数据,选最大即可。
二、另一种dp(队友思路)
#include <iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
float a[5],b[5],x[25]={0};
int c,i,j,v[5]={0,1,2,3,5};
scanf("%d",&c);
for(i=0;i<=c;i++)x[i]=1;
scanf("%f%f%f%f",&a[1],&a[2],&a[3],&a[4]);
b[1]=1+a[1];
b[2]=pow(1+a[2],2);
b[3]=pow(1+a[3],3);
b[4]=pow(1+a[4],5);
for(i=1;i<=4;i++)
for(j=0;j<=c;j++)if(j>=v[i])
x[j]=max(x[j],x[j-v[i]]*b[i]);
printf("%.5f\n",x[c]);
return 0;
}
这种思路来自背包dp的,代码因为一句“b[0] = 1+a[0]”没有加1而一直WA(小错酿大祸)。。。也是怪可惜的。。。