hdu6007 spfa 完全揹包

2022-06-13 16:42:11 字數 1440 閱讀 8704

題意:給你m,n,k,代表你有m點法力值,n個物品,k個製造方式

接下來n行,如果以1開頭則代表既能賣又能合成,0代表只能賣。

然後k行,每行第乙個數是要合成的東西,第二個數代表有幾對,每對第乙個數是那種物品,第二個是需要幾個。

注意不能直接合成的可以通過製造方式來合成。然後問你花費完所有的法力製造的東西,能獲得最大的金錢是多少

題解:首先處理出來對於所有物品所需要消耗的最小法力值,然後就是做一下完全揹包就可以了。

消耗最小法力值可以通過spfa獲得,乙個技巧就是對於同屬乙個目標產物的原材料,可以用乙個fa陣列來指向目標產物的vector的陣列下標.目標產物有兩個vector,其中乙個代表了是哪幾種原材料,然後另乙個對應的是這幾種原材料的個數。

然後再利用head陣列,得知乙個目標產物的原材料的邊的編號tot一定是連續的,那麼就把這連續一段的邊的編號指為當前目標產物的兩個vector的陣列下標就可以了。

具體詳見**。---強迫症是從0開始計的,所以說建邊的時候要減一

#include#include

#include

#include

#include

using

namespace

std;

const

int inf=0x3f3f3f3f

;int dp[10086],sell[208],pct[208],head[208

];bool vis[208

];int m,n,k,op,n,t,tas=1

,tot;

struct

node

e[100861

];void add(int u,int

v)vector

u[208

];vector

num[208

];int fa[100861

];void

spfa()

while(!q.empty())

ans+=pct[u[fa[i]][j]]*num[fa[i]][j];

}if(!ok) continue

;

if(ans}

}}int

main()

int now=0

;

for(int i=0; ii)

for(int j=last; jnow;

++now;

}spfa();

memset(dp,

0,sizeof

(dp));

for(int i=0; ifor(int j=pct[i]; j<=m; ++j) dp[j]=max(dp[j],dp[j-pct[i]]+sell[i]);

printf(

"case #%d: %d\n

",tas++,dp[m]);

}}

完全揹包 HDU 1114

今天看了看揹包九講的完全揹包。估計是因為只記住了方程,沒理解透的原因。照著寫,還是錯了 錯就錯在初始化的時候,我全部初始化為0了,然後用max 但是得不到答案。可是初始化出0位置以外,其他都為無窮大,取min,過了 額。去問問高手吧我。再研究了下,猛然回頭,發現,是求揹包裝滿的 最小價值 inclu...

hdu 1203(完全揹包)

problem description speakless很早就想出國,現在他已經考完了所有需要的考試,準備了所有要準備的材料,於是,便需要去申請學校了。要申請國外的任何大學,你都要交納一定的申請費用,這可是很驚人的。speakless沒有多少錢,總共只攢了n萬美元。他將在m個學校中選擇若干的 當然...

hdu 2546 (完全揹包)

problem description 電子科大本部食堂的飯卡有一種很詭異的設計,即在購買之前判斷餘額。如果購買乙個商品之前,卡上的剩餘金額大於或等於5元,就一定可以購買成功 即使購買後卡上餘額為負 否則無法購買 即使金額足夠 所以大家都希望盡量使卡上的餘額最少。某天,食堂中有n種菜 每種菜可購買一...