1. 程式人生 > 其它 >ElasticSearch中壓縮演算法LZ4的使用

ElasticSearch中壓縮演算法LZ4的使用

技術標籤:zero

Dynamic Programming之完全揹包

01揹包與完全揹包的比較:

在0/1揹包問題中,第 i 件物品只可以放0個或者1個,即選擇或者不選。而在完全揹包問題中,第 i 件物品可以放入0,1,2…個。即每件物品可以放入無限多次。

與0/1揹包相同的是,最大價值是物品數量 i 與揹包容量 j 的函式。最終的最大價值就是物品數量 i 從0增長到n,揹包容量 j 從0增長到m時的 f [ n ] [ m ] 函式值。f[ i ][ j ]表示前 i 件物品放入容量為 j 的揹包的最大價值。

①若當前物品的重量大於揹包的容量,即 w[ i ] > j 。則該物品不能放入 。f [ i ][ j ] 更新為 f [ i - 1] [ j ]。

②若當前物品的重量小於揹包的容量,即 w[ i ] < j 。則第 i 件物品可以放入揹包,但需要考慮代價,故分放入和不放入兩種情況。
(1)第 i 件物品不放入揹包。f [ i ][ j ] = f [ i - 1] [ j ]
(2)第 i 件物品放入揹包。f[ i ][ j ] = f[ i ][ j - w [ i ] ] + price[ i ]

完全揹包的狀態轉移方程

在這裡插入圖片描述
例題
原題連結
有 N 種物品和一個容量是 V 的揹包,每種物品都有無限件可用。
第 i 種物品的體積是 vi,價值是 wi。
求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。
輸出最大價值。

輸入格式
第一行兩個整數,N,V,用空格隔開,分別表示物品種數和揹包容積。
接下來有 N 行,每行兩個整數 vi,wi,用空格隔開,分別表示第 i 種物品的體積和價值。
輸出格式
輸出一個整數,表示最大價值。
資料範圍
0<N,V≤1000
0<vi,wi≤1000
輸入樣例
4 5
1 2
2 4
3 4
4 5
輸出樣例:
10

AC程式碼

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const
int N = 1010; int f[N][N];//二維陣列 int v[N];//價值陣列 int w[N];//重量陣列 int main(){ int n,m; scanf("%d%d",&n,&m); //初始化重量和價值陣列 for (int i = 1;i <= n;i++) scanf("%d%d",&w[i],&v[i]); //用i遍歷物品,用j遍歷揹包的容量 for (int i = 1;i <= n;i++){ for (int j = 1;j <= m;j++){ //狀態轉移方程 if (j < w[i]) f[i][j] = f[i - 1][j]; else f[i][j] = max(f[i - 1][j],f[i][j - w[i]] + v[i]); } } printf("%d\n",f[n][m]); }