V 道菜(≤100),每道菜價格 a[i]。餘額 rest,必須留 5 元(最貴菜 ≥5),求最大剩餘。即:從 V-1 道菜中選,總價 ≤ rest-5,最大化總價。
dp[v] 表示能湊出價值 v(布爾)。dp,記錄可達最大值 maxm。rest - maxm - 最貴菜價格?實際代碼中 maxm 已包含最貴菜邏輯,直接 rest - maxm。sort(a, a+V);
cin >> rest;
DP(); // 背包處理前V-1項,容量rest-5
cout << rest - maxm << endl;
void DP() {
for (i=0; i=0; v--)
if (f[v]) { if (v+a[i]<=rest) f[v+a[i]]=1; maxm=max(maxm, v+a[i]); }
}
本題是「必選最貴項目 + 0-1 背包選其餘」的變體,排序後分離必選項簡化邏輯,背包容量為 rest-5 確保剩餘 ≥5。