问题描述 Problem Description
某人购置了一辆新卡车, 从事个体运输业务. 给定以下各有关数据:
设某卡车已使用过
①如果继续使用, 则第
②如果卖掉旧车, 买进新车, 则 第
该运输户从某年初购车日起, 计划工作
输入描述 Input Description
第
第
第
第
第
输出描述 Output Description
第
第
年序号 ( 从
否更新 ( 当年如果更新, 输出
当年回收额 (
输入样例 Sample Input
4
5
8 7 6 5 4 2
0.5 1 2 3 4 5
0 2 3 5 8 10
输出样例 Sample Output
24.5
1 0 7.5
2 1 5.5
3 1 5.5
4 0 6.0
分析 I Think
题目已经把状态转移方程差不多都给了…
代码 Code
#include <cstdio>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;
const double eps = 1E-8;
double r[22],u[22],c[22];
double f[22][22];
int n,k;
void display(int,int);
int main(){
scanf("%d%d",&n,&k);
for(int i=0;i<=k;++i)
scanf("%lf",&r[i]);
for(int i=0;i<=k;++i)
scanf("%lf",&u[i]);
for(int i=0;i<=k;++i)
scanf("%lf",&c[i]);
r[k+1] = -1E20;
u[k+1] = c[k+1] = 1E20;
for(int i=0;i<=n;++i)
for(int j=0;j<=k;++j)
f[i][j] = -1E20;
f[1][1] = r[0]-u[0];
for(int i=1;i<n;++i)
for(int j=1;j<=k;++j){
f[i+1][j+1] = max(f[i+1][j+1],f[i][j]+r[j]-u[j]);
f[i+1][1] = max(f[i+1][1],f[i][j]+r[0]-u[0]-c[j]);
}
double ans = -1E20;
int p;
for(int i=0;i<=k;++i)
if(ans < f[n][i]){
ans = f[n][i];
p = i;
}
printf("%.1lf\n",ans);
display(n,p);
return 0;
}
void display(int p,int q){
if(p == 1){
printf("1 0 %.1lf\n",f[1][1]);
return ;
}
if(q == 1)
for(int i=1;i<=k;++i)
if(fabs(f[p-1][i]+r[0]-u[0]-c[i]-f[p][q]) < eps){
display(p-1,i);
printf("%d 1 %.1lf\n",p,r[0]-u[0]-c[i]);
return ;
}
display(p-1,q-1);
printf("%d 0 %.1lf\n",p,r[q-1]-u[q-1]);
}