Luogu P3985 不開心的金明

2022-05-09 19:46:34 字數 1258 閱讀 2465

簡單來說就是01揹包問題,但是物品最大數量為 \(100\), 物品重量和價值都 \(\leq 10^9\),但是保證極差(最大值減最小值) \(\leq 3\)。

機房大佬給我說了這個題想了一下就胡出來做法了,但是一開始寫掛了233333

先把所有的重量都減去它們的最小值,則剩下的重量一定都 \(\leq 3\)。剩下就比較簡單了。

\(w[i]\) 表示第 \(i\) 個物品的重量(減去最小值), \(v[i]\) 表示第 \(i\) 個物品的質量, 計 \(minn\) 為原先重量的最小值。

設 \(f[i][j]\) 為選 \(i\) 個物品,重量為 \(j\) (已經減去重量的最小值)的最大價值。

對於選第 \(i\) 個物品對這個進行更新,有:

\[f[j][k]=\max\ \ \ (j*minn+k\leq m,w[i]\leq k \leq j*3)

\]因為為01揹包,所以 \(j\) 和 \(k\) 都是倒序迴圈。

感性理解一下,\(j\) 代表選擇了幾個物品,\(k\) 代表選擇的 \(\sum w[l]\) 的值,此時此刻的答案。

\(j*minn+k\leq m\) 就是滿足選出的物品在揹包容量內,\(w[i]\leq k \leq j*3\) 這裡的範圍是 \(k\) 所有可能的取值,因為 \(\max\\}=j*3\) 就是 \(w\)全都是 \(3\) 的情況,\(\min\\}=w[i]\) 就是前面 \(w\) 全是 \(0\) 的情況。

#include#include#include#define ll long long

#define int long long

inline int max(int x, int y)

inline int min(int x, int y)

inline int read()

while(ch >= '0' && ch <= '9')

return w ? ~r + 1 : r;

}#undef int

const int n = 1100;

const int w = 3300;

const ll inf = 0x7fffffffffffffff;

int n, m;

ll w[n], v[n], minn = inf;

ll f[n][w], ans;

int main()

} printf("%lld\n", ans);

return 0;

}

luogu P1060 開心的金明

金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n元錢就行 今天一早金明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的n元。於是,他把每件物品規定了乙個重要度,分為5...

開心的金明

開心的金明 問題描述 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n 元錢就行 今天一早金明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的n 元。於是,他把每件物...

開心的金明

問題描述 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎 麼布置,你說了算,只要不超過n元錢就行 今天一早金明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的n元。於是,他把每件物品規定了一 個...