洛谷 P1977 出租车拼车

题目传送门

解题思路:

f[i][j]表示前i辆车走了j个人的最小价钱。

AC代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 
 5 using namespace std;
 6 
 7 int n,m,d,s,k,ans;
 8 int t[101],c[101],f[101][101];
 9 
10 inline int min(int a,int b) {
11     if(a >= b) return b;
12     return a;
13 }
14 
15 int main() {
16     scanf("%d%d%d%d",&n,&k,&d,&s);
17     memset(f,0x3f3f3f,sizeof(f));
18     for(int i = 1;i <= k; i++) {
19         scanf("%d%d",&t[i],&c[i]);
20         if(t[i] > s && m == 0) m = i - 1;//如果在s之后,就不管了
21     }
22     if(m == 0) m = k;
23     f[0][0] = 0;
24     for(int i = 1;i <= m; i++)
25         for(int j = 0;j <= n; j++) {
26             f[i][j] = f[i-1][j];
27             for(int k = 0;k <= min(c[i],j); k++)
28                 f[i][j] = min(f[i][j],f[i-1][j-k] + k * t[i] + d);
29         }
30     if(f[m][n] > 1000000000) printf("impossible");
31     else
32         printf("%d",f[m][n]);
33     return 0;
34 }
原文地址:https://www.cnblogs.com/lipeiyi520/p/13487777.html