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