外贸网站案例/怎么推广软件让别人下载
http://poj.org/problem?id=1857
要运送车辆到对岸.车辆已经排好队,注意因为桥窄不能超车,分组的时候不能随意分组,前一组的车辆都排在后一组车辆的前面,即车辆的顺序是按输入固定的。只有一座单行的桥,每辆车有其重量及最最快车速,通过分组方式将车辆分成几组运输,每次只能运一组运到对岸后第二组才能出发,每组中车辆的总重量不能超过桥的载重量,运输速度则取决于该组车辆中最慢的那辆。
问如何分组,运输最快。
动态规划,从前向后,依次求出到i位置时的最优解,考i位置的时候,考虑i-1,i-2...直到i - j加在一起超过了载重量,则所有这些位置可能性都需要考虑到。
考虑如果没有速度区别,应该是贪心算法,考虑i位置的时候向前,该组装的越多越好。
# include<iostream>
# include<stdio.h>
using namespace std;# define N 1005double result[N],t;int main()
{int b,l,n,ws[N][2],w,s;int i,j;while(true){cin>>b>>l>>n;if(b==0 && l==0 && n==0){break;}l*=60;result[0]=0.0; //guarder: result[i]=l*60.0/ws[i][1]+result[i-1]; and t=l*60.0/s+result[j-1];for(i=1;i<=n;i++){cin>>ws[i][0]>>ws[i][1];//先单独走result[i]=l*1.0/ws[i][1]+result[i-1];//和前面依次组合w=ws[i][0];s=ws[i][1];for(j=i-1;j>=1&&(w+=ws[j][0])<=b;j--){if(ws[j][1]<s){s=ws[j][1];}t=l*1.0/s+result[j-1];if(result[i]>t){result[i]=t;}}}printf("%.1f\n",result[n]);}return 0;
}
没AC,但觉得思路没错(有知道怎么回事的留个言,多谢^_^):
# include<iostream>
# include<stdio.h>
using namespace std;# define N 1003
# define INF_TIME 100000.0double lowTime[N][N],result[N];int main()
{int b,l,n,i,j,k;int ws[N][2];while(true){cin>>b>>l>>n;if(b==0 && l==0 && n==0){break;}for(i=1;i<=n;i++){cin>>ws[i][0]>>ws[i][1];}for(i=1;i<=n;i++){k=0;lowTime[i][i-1]=0.0;for(j=i;j<=n;j++){k+=ws[j][0];if(k>b){lowTime[i][j]=INF_TIME;}else{lowTime[i][j]= lowTime[i][j-1]>(l*60.0/ws[j][1])? lowTime[i][j-1]:(l*60.0/ws[j][1]) ; // >}}}result[1]=lowTime[1][1];for(i=2;i<=n;i++){//result[i]= min( min(j:[1,i-1]=>result[j]+lowTime[j+1][i]), lowTime[1][i] );result[i]=lowTime[1][i];for(j=1;j<=i-1;j++){result[i]= result[i]<result[j]+lowTime[j+1][i]? result[i]:result[j]+lowTime[j+1][i];}}printf("%.1f\n",result[n]);}return 0;
}