揹包 最短路 洛谷2662 牛場圍欄 題解

2021-08-03 14:19:51 字數 972 閱讀 1031

給出n個物品,每個物品都有體積v且有無數個,問最大的不能組成的體積(如果均能組成或最大的不能組成的體積不存在輸出-1)。

我們很快就會發現這是揹包,但是這道題並沒有給出揹包上界,所以正常的揹包很難處理此問題。

然而實際上有一種套路是:物品無限+物品體積小+揹包非常大=最短路

我們隨便取乙個物品,假設體積是v。定義f[i]表示模v同餘i的最小物品體積,那麼只要f[i]存在,f[

i]+k

v(k∈

n)就可行,而模v同餘i的第乙個不可行的就是f[i]-v。那麼只需要刷出ma

x 就是答案(如果任何乙個f[i]不存在就是最大值不存在,如果對於所有i都有f[i]=i說明所有都可行)。

#include

#include

#include

using

namespace

std;

const

int maxn=3000;

int n,m,l[maxn+5],dis[maxn+5],que[maxn+5];

bool vis[maxn+5];

#define amod(x) (((x)+1)%maxn)

int spfa()}}

for (int i=0;i1];i++) if (dis[i]==inf) return -1;

int ans=0;for (int i=0;i1];i++) ans=max(ans,dis[i]-l[1]);

if (ans==0) return -1;

return ans;

}int main()

n=0;for (int i=1;i<=maxn;i++) if (vis[i]) l[++n]=i;

return

printf("%d\n",spfa()),0;

}

Luogu2662 牛場圍欄(最短路)

小凱的疑惑公升級版的公升級版。答案若存在不會超過30002 3000,暴力dp似乎勉強可以過。當然這不優美。注意到如果能拼出長度為l的圍欄,就一定能拼出長度為l kx的圍欄,其中x為最短的 或任意乙個 圍欄長度。這樣將值域範圍縮小到了3000以內。於是將同餘類間連長為木料長度的邊,求出0為源點到每個...

洛谷 P2662 牛場圍欄

小l通過泥萌的幫助,成功解決了二叉樹的修改問題,並因此寫了一篇 成功報送了叉院 羨慕不?勤奮又勤思的他在研究生時期成功轉系,考入了北京大學光華管理學院!畢業後,憑著自己積累下的濃厚經濟學與計算機學的基礎,成功建設了乙個現代化奶牛場!奶牛們十分聰明,於是在牛場建圍欄時打算和小l鬥智鬥勇!小l有n種可以...

洛谷 P2662 牛場圍欄 題解

題目傳送門 題目大意 給出若干種木棍的長度,每種木棍數量無限,每根木棍可以削短 1 11 m mm 的長度再用,然後問用這些木棍不能組成的最大長度是多少,如果所有長度都能組成或不存在這個最大長度,那麼輸出 1 1 1。考慮同餘最短路,設長度 a aa 作為模數,求出 f ff 陣列,f i f i ...