機試演算法講解 第56題 多重揹包之一起支援災區

2021-07-04 06:28:35 字數 1287 閱讀 2735

/*

多重揹包:介於0-1揹包和完全揹包之間。容積為v的揹包,給定一些物品,每種物品包含體積w,價值v和數量k,求用該揹包能裝下的最大價值總量。

每種武平可選的數量不再為無窮或者1,而是乙個確定的數k。將多重轉換為0-1揹包。即每種物品被視為k種不同物品,對所有物品求0-1揹包。

將原數量為k的物品拆分為若干組,每組物品包含的原物品個數分別為:1,2,4,...,k-2的c+1次方,其中c為使k-2的c+1次方》0的最大整數。類似與

二進位制拆分。可以得到0到k之間任意物品價值重量和。對所有這些信物品做0-1揹包。

問題:支援災區。你有n元,市場有m種大公尺,每種打磨都是袋裝產品,**不等,並且只能整袋購買。你最多能採購多少公斤糧食

輸入:第一行1個正整數c(表示有c組測試用例),每組測試用例的第一行時兩個整數n和m(1<=n<=100,1<=m<=100),分別表示經費的金額和大公尺的種類,然後是m行資料。

每行包括3個數p,h和c(1<=p<=20,1<=h<=200,1<=c<=20),分別表示每袋的**、每袋的重量以及對應種類大公尺的袋數。

輸出:輸出能夠購買大公尺最多重量,經費可以不用完

輸入:1

8 22 100 4

4 100 2

輸出:400

關鍵:1多重揹包轉化為0-1揹包後,採用逆序

2 揹包問題:外層迴圈是物體,內層迴圈是總容積,對每個物品求其價值總和

3 拆分方法:

while(k-c>0)

//注意最後一次拆分是用k乘不是用c乘

list[++icnt].v = k*v;

list[icnt].w = k*w;

*/#include #include #include int max(int a,int b)

typedef struct list

list;

int main(int argc,char* argv)

//易錯,最後一次的k小於c,也要拆分,這裡是乘以k倍而不是c倍

list[++icnt].v = k*v;

list[icnt].w = k*w;

}//揹包初始化,s為總體積

for(i = 0 ; i <= s; i++)

//揹包計算,cnt為物品數,s為總體積

for(i = 1 ; i <= icnt ; i++)

}printf("%d\n",dp[s]);

} }system("pause");

getchar();

return 0;

}

機試演算法講解 第54題 0 1揹包之如何採藥

揹包 種類 0 1揹包,完全揹包,多重揹包。0 1揹包 含義 有乙個容量為v的揹包和物品,物品與兩個屬性,體積w和價值v,每種物品只有1個。要求用這個揹包裝下價值盡可能多的物品,求該最大價值,揹包可以不被裝滿。特點 每個物品至多能選1件,物品數量只有0和1兩種情況。dp i j 表示總體積不超過j的...

機試演算法講解 第55題 Piggy Bank

問題 與乙個儲蓄罐,告知空的質量和當前重量,並給定一些錢幣的價值和相應的重量,求儲蓄罐中最少有多少現金。輸入 包含t組測試用例。第一行。每乙個測試用例包含2個整數e和f,表明空儲蓄罐的重量和裝滿錢的重量。10,000g,第二行是每個測試用例,包含乙個整數n 1 n 500 給出了各種硬幣的數量。接下...

機試演算法講解 第58題 輸入外掛程式

輸入外掛程式 scanf快於 cin,在scanf基礎上再次優化,使那些剛超時一點的程式能夠卡金時限範圍。原理 在讀入緩衝中字元的前提下,手動分析字串中輸入的整數 浮點數等我們需要的輸入型別,並將其儲存在變數中 include include include 輸入整數,並將整數儲存在引用變數ret中...