poj 1700 【乘船问题】【动态规划】

题意:n个人坐船过河,只有一条船,每条船能坐两个人,过河的时间取决于两个人中最慢的一个,问过河最快共需多少时间?

 

先使d[0...n-1]有序;
 
则   
        d[0]表示过河最快的
        d[1]表示过河次快的
 
对于每一个i,
        d[i]    表示当前过河最慢的 
        d[i-1] 表示当前过河次慢的
dp[0]=d[0];   
dp[1]=d[1];
dp[2]=dp[1]+d[2]+d[0];
//(i>=3)时,dp[i]是以下两种情况中速度快的一种:
//(  此时d[0] d[1]已在对岸)
//1. 在dp[i-1]的前提下 d[0]回来,将d[i]带走 
//2. 在dp[i-2]的前提下 d[0]回来,d[i]将d[i-1]带走,d[1]回来将d[0]带走  
dp[i]=min(dp[i-1]+d[0]+d[i],dp[i-2]+d[1]+d[0]+d[i]+d[1]);

 

有人说不知道样例输入数据是怎么构造出17的,见下面简图:

poj 1700 【乘船问题】【动态规划】_第1张图片

 

 

#include
#include
using namespace std;

int d[1010];
int dp[1010];

int main(){
	int cases;
	cin>>cases;
	while(cases--){
		int n;
		int min1;
		int min2;
		cin>>n;
		for(int i=0;i>d[i];
		}
		sort(d,d+n);
		dp[0]=d[0];
		dp[1]=d[1];
		dp[2]=dp[1]+d[2]+d[0];
		for(int i=3;i


 

 

你可能感兴趣的:(poj)