/*
多重揹包:介於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中...