首先多重揹包很容易想到這樣暴力轉移:
for(int i=1;i<=n;i++)}}但這個題是會t的。
於是,有了兩種對多重揹包的優化:分別是二進位制拆分和單調佇列優化。
把每種物品的數量拆分成二進位制的形式,這樣就可以在表示出所有數量的前提下,保證物品數最小。
證明略,具體**如下:(非常好理解)
#include #include二進位制拆分(寶物篩選)#include
#include
#include
#define ll long long
#define ui unsigned int
#define ull unsigned long long
#define r register
using
namespace
std;
namespace
chu_xuan
void read(int &a) while(c>='
0'&&c<='
9') a=(a<<3)+(a<<1)+c-48,c=getchar();a*=b;}
int in() while(c>='
0'&&c<='
9') a=(a<<3)+(a<<1)+c-48,c=getchar();return a*b;}
int max(int a,int b)
int min(int a,int b)
}using
namespace
chu_xuan;
const
int n=1e6+5
;int
n,m,f[n],v[n],w[n],cnt;
intmain()
if(c) v[++cnt]=a*c,w[cnt]=b*c;
}for(int i=1;i<=cnt;i++)
}cout
;
return0;
}
待填坑
洛谷P1776 寶物篩選
當年在tb桌前跪著聽懂了單調佇列優化多重揹包 然後那天下午codevs上的多重揹包一直過不去 現在codevs沒了,時間過得真快,有點心酸,當年bzoj也不知道,全在codevs上做題,好多 記錄都沒了。今天突然發現這題補掉,舒服了 includeusing namespace std const ...
洛谷P1776 寶物篩選
題目描述 終於,破解了千年的難題。小 ff 找到了王室的寶物室,裡面堆滿了無數價值連城的寶物。這下小 ff 可發財了,嘎嘎。但是這裡的寶物實在是太多了,小 ff 的採集車似乎裝不下那麼多寶物。看來小 ff 只能含淚捨棄其中的一部分寶物了。小 ff 對洞穴裡的寶物進行了整理,他發現每樣寶物都有一件或者...
洛谷p1776寶物篩選
寶物篩選 多重揹包問題 物品數目已知 可以列舉每個物品 當做01揹包來做 不過會超時 此時需要二進位制拆分來優化 分解成新的物品 再跑一遍01揹包即可 二進位制拆分 01揹包 設f j 表示前i件物品花費恰好為j的最大價值 include include using namespace std co...