第九章 動態規劃-1296:開餐館

1296:開餐館

時間限制: 1000 ms 內存限制: 65536 KB
提交數: 3952 通過數: 1923
【題目描述】
信息學院的同學小明畢業之後打算創業開餐館.現在共有n個地點可供選擇。小明打算從中選擇合適的位置開設一些餐館。這 n個地點排列在同一條直線上。我們用一個整數序列m1,m2,…mn來表示他們的相對位置。由於地段關係,開餐館的利潤會有所不同。我們用pi 表示在mi處開餐館的利潤。爲了避免自己的餐館的內部競爭,餐館之間的距離必須大於k。請你幫助小明選擇一個總利潤最大的方案。

【輸入】
輸入第一行是整數 T(1≤T≤1000),表明有T組測試數據。緊接着有T組連續的測試。每組測試數據有3行。

第1行:地點總數n(n<100), 距離限制k(k>0且k<1000);

第2行:n 個地點的位置m1,m2,…mn(1000000>mi>0 且爲整數,升序排列);

第3行:n 個地點的餐館利潤p1,p2,…pn(1000>pi>0 且爲整數)。

【輸出】
對於每組測試數據可能的最大利潤。

【輸入樣例】
2
3 11
1 2 15
10 2 30
3 16
1 2 15
10 2 30
【輸出樣例】
40
30


思路:01揹包的變式,f[i]表示前i個地點開餐館的最大利潤:狀態轉移方程
f[i] = max(f[i],f[j] + c[i]);計算每個位置所能獲得的最大利潤,再求最大值。

#include<cstdio>
#include<iostream>
#define N 1001
#define INF 0X3F3F3F3F
using namespace std;
int w[N],c[N],f[N];
int main(){
	int T;
	cin >> T;//測試數據組數
	while(T--)//每測試一直 減去-次
	{
		int n,k;
		cin >> n >> k; //輸入總數n和距離限制K
		for(int i = 1; i <= n; i++)
		cin >> w[i];   // n 個地點位置
		for(int i = 1; i <= n ; i++)
		{
			cin >> c[i];// n個地點的餐館利潤
			f[i] = c[i];
		}
		for(int i = 1; i<= n; i++)
		  for(int j = 1; j <= n; j++)
		   if(w[i] - w[j] > k)//餐館之間的距離必須大於k
		   f[i] = max(f[i],f[j] + c[i]);//f[i]表示前i個地點開餐館的最大利潤
	int maxx = -INF;//初值無限小
	for(int i = 1; i <= n; i++)//再求利潤最大值
	 maxx = max(f[i], maxx);
	cout << maxx << endl;
}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章