1 #include2 #include3 #include4 #include5const
int qq=2000+50;6
intv[qq],w[qq],dp[qq];
7using
namespace
std;
8int
main()929
if(tot)33}
34for(int i=1;ii)
35for(int j=n;j>=v[i];--j) //
j必須從n開始dp,如果循序開始dp的話v[i]會被取多次
36 dp[j]=max(dp[j],dp[j-v[i]]+w[i]); //
也就是說達不到01揹包要求的v[i]只有取和不取兩種狀態、
37 printf("
%d\n
",dp[n]); 38}
39 }
演算法時間複雜度o(v*∑log n[i])
總算是理解了為什麼要逆序dp
#include 02.#include03.#include 04.using
namespace
std;
05.int
main()
06.
28. }
29. }
30. printf("
%d\n
",temp);
31. }
32. return
0;
33.}
上述**是借鑑別人的、 也是多重揹包最原始的解法
時間複雜度o(v*∑n[i])
HDU 2191 多重揹包問題
題目資訊 problem description 急!災區的食物依然短缺!為了挽救災區同胞的生命,心繫災區同胞的你準備自己採購一些糧食支援災區,現在假設你一共有資金n元,而市場有m種大公尺,每種大公尺都是袋裝產品,其 不等,並且只能整袋購買。請問 你用有限的資金最多能採購多少公斤糧食呢?input ...
HDU 2191 多重揹包
problem description 急!災區的食物依然短缺!為了挽救災區同胞的生命,心繫災區同胞的你準備自己採購一些糧食支援災區,現在假設你一共有資金n元,而市場有m種大公尺,每種大公尺都是袋裝產品,其 不等,並且只能整袋購買。請問 你用有限的資金最多能採購多少公斤糧食呢?後記 人生是乙個充滿了...
HDU 2191 多重揹包
題目大意 有m種公尺,給出每種公尺花費,重量和數量,問n元能獲得的最大重量是多少 題目思路 對於每個包,如果數量 花費 n,那麼很明顯直接多重揹包即可,否則就需要用到二進位制拆分法。由於0 2 k 1內所有的數字都可以通過2 0 2 1 2 2.2 k 1 中若干個數字得到。那麼可以把數量為c的物品...