題意:給你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種菜 每種菜可購買一...