題目描述
miranda 準備去市裡最有名的珠寶展覽會,展覽會有可以購買珠寶,但可惜的是只能現金支付,miranda 十分糾結究竟要帶多少的現金,假如現金帶多了,就會比較危險,假如帶少了,看到想買的右買不到。展覽中總共有 n種珠寶,每種珠寶都只有乙個,對於第 i種珠寶,它的售價為 ci萬元,對 miranda 的吸引力為 vi。miranda 總共可以從銀行中取出 k萬元,現在她想知道,假如她最終帶了 i萬元去展覽會,她能買到的珠寶對她的吸引力最大可以是多少?
題解
菜死了菜死了。。
因為普通的01揹包問題是np的,所以我們要觀察題目中的一些特殊性質。
注意到c非常小,可以把c拿出來做文章。
對於每乙個物品體積,我們可以有方程:dp[i]+sum[j-i]->dp[j]
對於c一樣的物品,我們要選肯定是要先選價值大的,所以sum陣列是乙個上凸的。
我們可以對於每個c,再去列舉餘數,在相同餘數下進行dp。
因為有了上面的結論,那麼我們的dp就有了單調性,若i轉移到了x,那麼(l-x)只會被(l-i)轉移,(x-r)只會被(i-r)轉移。
可以用分治dp做。
**
#include#include
#include
#include
#define m 302
#define k 50002
#define n 1000002
using
namespace
std;
typedef
long
long
ll;ll dp[
2][k],g[2
][k];
intpre,now,pos,n,k,mx;
vector
vec[m];
inline
intrd()
while(isdigit(c))
return f?-x:x;
}inline ll cmp(ll x,ll y)
void solve(int l,int r,int l,int r,int
sum)
}if(point<0)point=l;
g[now][mid]=num;
solve(l,point,l,mid-1,sum);solve(point,r,mid+1
,r,sum);
}int
main()
now=1;pre=0
;
for(int i=1;i<=mx;++i)if
(vec[i].size())
}for(int i=1;i<=k;++i)printf("
%lld
",dp[now][i]);
return0;
}
雅禮集訓 2017 價
傳送門 乙個不太顯然的最小割做法。我們這麼連邊 源點向藥物連 infty p i 容量的邊,藥物向它對應的藥材連 infty 容量的邊,藥材向匯點連 infty 容量的邊。用源點的流量減去最小割,再負回來就可以求出答案了。怎麼理解呢?割掉一條邊表示不選其對應的藥物或藥材,我們發現最後的方案一定是完美...
6029 雅禮集訓 2017 Day1 市場
6029.雅禮集訓 2017 day1 市場 題目描述 從前有乙個 市場,在一位執政官到來之前都是非常繁榮的,自從他來了之後,發布了一系列奇怪的政令,導致 市場的衰落。有 n nn 個商販,從 0 n 1 0 sim n 10 n 1 編號,每個商販的商品有乙個 ai a ia i 有兩種政令 l,...
雅禮集訓 2017 Day2 解題報告
我怎麼知道這種題目都能構造樹形結構。根據高度構造一棵樹,在樹上倍增找到最大的小於約束條件高度的隔板,開乙個 vector 記錄一下,然後對於每個 vector 按照高度排序一下,樹形 dp 即可 code below include define pii pair define mp make pa...