雅禮集訓 2017 Day5 珠寶

2022-07-13 19:24:11 字數 1457 閱讀 3677

題目描述

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...