hdu 4526

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4526

思路:dp[i][j]表示前i辆车送走j个acmer的最小花费,然后就有dp[i][j]=dp[i-1][j-k]+k*t+d;(t为车辆到达的时间,d为花费),值得注意的地方是dp[0][0]=0,而其余都应该初始化为inf.

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 using namespace std;
 6 #define inf 1<<30
 7 int n,k,d,s,t,z;
 8 int dp[111][111];
 9 //dp[i][j]表示前i辆车送走j的acmer的最小花费,则有dp[i][j]=min(dp[i][j],dp[i-1][j-p]+p*time[i]+d);
10 
11 int main(){
12     int _case;
13     scanf("%d",&_case);
14     while(_case--){
15         scanf("%d%d%d%d",&n,&k,&d,&s);
16         for(int i=0;i<=k;i++)
17             for(int j=0;j<=n;j++)
18                 dp[i][j]=inf;
19         dp[0][0]=0;
20         for(int i=1;i<=k;i++){
21             scanf("%d%d",&t,&z);
22             for(int j=0;j<=n;j++){
23                 dp[i][j]=dp[i-1][j];
24                 for(int k=1;k<=z;k++){
25                     if(j>=k){
26                         dp[i][j]=min(dp[i][j],dp[i-1][j-k]+k*t+d);
27                     }
28                 }
29             }
30         }
31         if(dp[k][n]<inf){
32             printf("%d\n",dp[k][n]);
33         }else 
34             puts("impossible");
35     }
36     return 0;
37 }
38 
39 
40 
41     
View Code

 

posted @ 2013-05-21 17:20  ihge2k  阅读(193)  评论(0编辑  收藏  举报