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;
}