遊戲場景:敵方防禦塔生命值 L,工廠可生產 N 種戰艦。第 i 種戰艦生產需 t_i 秒,生產完成後每秒造成 l_i 傷害。每次只能生產一種(可重複生產同種)。求摧毀塔的最短時間。
這是一種「生產即投資」的背包變體:花費時間 t_i 獲得持續收益 l_i。類似完全背包但收益隨剩餘時間線性增長。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXL = 330;
const int MAXT = 2000; // 足夠大的時間上限
int dp[MAXT+1];
int t[35], l[35];
int main() {
int N, L;
while(scanf("%d%d", &N, &L) == 2) {
for(int i = 1; i <= N; i++) scanf("%d%d", &t[i], &l[i]);
memset(dp, 0, sizeof(dp));
int ans = -1;
for(int T = 1; T <= MAXT; T++) {
for(int i = 1; i <= N; i++) {
if(T >= t[i])
dp[T] = max(dp[T], dp[T - t[i]] + (T - t[i]) * l[i]);
}
if(dp[T] >= L) { ans = T; break; }
}
printf("%d\n", ans);
}
return 0;
}
輸入: 1 1 1 1 2 10 1 1 2 5 3 100 1 10 3 20 10 100 輸出: 2 4 5
本題將「生產-收益」建模為時間維度上的 DP,核心是識別出 `dp[T]` 的物理含義並正確推導轉移方程。屬於背包問題的變體應用。