有 $N$ 個物品,第 $i$ 個物品重量為 $w_i$,價值為 $v_i$,背包容量為$W$,求背包內物品的最大價值總和 $(N \le 100,\,w_i \le W \le 10^5,\,v_i \le 10^9\,)$。
* DP 定義:
* $dp[\,j\,]$:當前背包重量為 $j$ 時的最大價值和
* 找出轉移式:
* 考慮前 $i-1$ 個物品的取捨,當前重量和為 $j$
* 第 $i$ 個商品選擇取或不取
* 取:$dp[\,j\,]=dp[\,j-w[\,i\,]\,]+v[\,i\,]$
* 不取:$dp[\,j\,]$ 維持不變
* 轉移式:$dp[\,j\,]=\max(dp[\,j\,],\,dp[\,j-w[\,i\,]\,]+v[\,i\,])$
```cpp
void sol(){
cin >> N >> W ;
for(int i = 1; i <= N; i ++)
cin >> w[i] ;
for(int i = 1; i <= N; i ++)
cin >> v[i] ;
for(int i = 1; i <= N; i ++)
// 先遍歷物品:因為是對物品選擇取或不取來決定重量
for(int j = W; j >= w[i]; j --)
// j >= w[i]:若 w[i] > j 顯然放不下
// 重量(j)由大到小遍歷:因為每個物品只能取一次,這樣是為了確保 dp[j] 是由 dp[j - w[i]] 推得
dp[j] = max(dp[j - w[i]] + v[i], dp[j]);
cout << dp[W] << "\n" ;
}
```