有一些物品,每種物品有各自的價值和代價,問給定代價之內選一些物品可以得到多少價值
有n件物品和乙個最大重量為v的揹包。第i件物品的重量是c[i], 價值是w[i]。求解將哪些物品裝入揹包可以使揹包價值總和最大,每種物品最多只能選一次動態規劃:
時間複雜度: o(nv)
空間複雜度:o(v)
dp[i][j]表示只考慮前i件物品,恰好放入乙個容量為j的揹包可以獲得的最大價值
狀態轉移方程(i從1到n迴圈, j從0到v迴圈)
dp[i][j] = max(dp[i-1][j], dp[i-1][j-c[i]] + w[i])
優化空間:不需要二維陣列
狀態轉移方程(i從1到n迴圈, j從v到0迴圈)
dp[j] = max(dp[j], dp[j-c[i]] + w[i])
**示例
letn,
vlet dp =
newarray
(1001
)let c =
newarray
(100001
)let w =
newarray
(100001
)for
(let i =
1; i <=
n; i++)}
console.
log(dp[v]
)
時間限制:c/c++ 3秒,其他語言6秒
空間限制:c/c++ 32m,其他語言64m
小v最近在玩一款挖礦的遊戲,該遊戲介紹如下:
1、每次可以挖到多個礦石,每個礦石的重量都不一樣,挖礦結束後需要通過一款平衡礦車運送下山;
2、平衡礦車有左右2個車廂,中間只有1個車輪沿著導軌滑到山下,且礦車只有在2個車廂重量完全相等且礦石數量相差不超過1個的情況下才能成功運送礦石,否則在轉彎時可能出現側翻。
假設小v挖到了n(n<100)個礦石,每個礦石重量不超過100,為了確保一次性將n個礦石都運送出去,一旦礦車的車廂重量不一樣就需要購買配重砝碼。請問小v每次最少需要購買多少重量的砝碼呢? (假設車廂足夠放下這些礦石和砝碼,砝碼重量任選)
輸入描述:
輸入n個正整數表示每個礦石的重量
輸出描述:
輸出乙個正整數表示最少需要購買的砝碼重量
輸入例子1:
3 7 4 11 8 10
輸出例子1:
1
例子說明1:
小v可以將重量3,7和11的礦石放到左車廂,重量4,8和10 放到右車廂,然後購買重量為1的砝碼放到左車廂
function
solution
(stones));
// console.log(totalweight)
let halfnum = math.
round
(stones.length /2)
let halfweight = math.
round
(totalweight /2)
let difference =
10000
// 動態規劃, dp[i][j]表示用i塊礦石能否使用的重量為j
// 定義二維陣列 dp
let dp =
newarray
(100
)for
(let i =
0; i <
100; i++
)// 0塊礦石的重量0是可以的
dp[0]
[0]=
true
// 定義重量
let weight =
0// 第一層遍歷陣列
// console.log(dp)
// 第一層遍歷陣列
for(
let i =
0; i < stones.length; i++)}
}}}return math.
abs(totalweight - weight *2)
}line =
readline()
var stones = line.
split
(" ");
print
(solution
(stones)
);
演算法(揹包問題 01揹包問題)
01揹包問題 有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品數量和揹包容積。接下來有 n 行,...
揹包問題之01揹包問題
題目 有n件物品和乙個容量為v的揹包。第i件物品的容量是c i 價值為w i 求解將哪些物品裝入揹包可以使得這些物品的費用總和不超過揹包容量,且價值總和最大。基本思路 作為最基礎的揹包問題,特點是 每種物品只有一件,可以選擇放或者是不放。用子問題定義狀態 f i v 表示前i件物品恰好放入乙個容量為...
揹包問題之01揹包
01揹包就是說針對每一件物品,有選擇裝入或者放棄,是屬於動態規劃類的問題。現在假設我們有m件物品,各有價值,揹包承重為10,假設當前可用的承重量為v,當前在抉擇第m件物品是否放入,重量為w1,價值為v1,那麼,如果不放入,我們的價值應該保持不變,並與之前算出的最大價值相同,如果放入,放入後的價值就是...