日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

ACwing 5. 多重背包问题 II(二进制拆分+DP)

發(fā)布時(shí)間:2024/7/5 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ACwing 5. 多重背包问题 II(二进制拆分+DP) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 1. 題目
    • 2. 解題

1. 題目

有 N 種物品和一個(gè)容量是 V 的背包。

第 i 種物品最多有 si 件,每件體積是 vi,價(jià)值是 wi。

求解將哪些物品裝入背包,可使物品體積總和不超過(guò)背包容量,且價(jià)值總和最大。
輸出最大價(jià)值。

輸入格式
第一行兩個(gè)整數(shù),N,V,用空格隔開(kāi),分別表示物品種數(shù)和背包容積。

接下來(lái)有 N 行,每行三個(gè)整數(shù) vi,wi,si,用空格隔開(kāi),分別表示第 i 種物品的體積、價(jià)值和數(shù)量。

輸出格式
輸出一個(gè)整數(shù),表示最大價(jià)值。

數(shù)據(jù)范圍
0<N≤1000
0<V≤2000
0<vi,wi,si≤2000
提示:
本題考查多重背包的二進(jìn)制優(yōu)化方法。

輸入樣例
4 5
1 2 3
2 4 1
3 4 3
4 5 2

輸出樣例:
10

題目來(lái)源:https://www.acwing.com/problem/content/description/5/

2. 解題

本題是在 4. 多重背包問(wèn)題 I 的基礎(chǔ)上,加大了數(shù)據(jù)規(guī)模,直接用上一題的代碼是沒(méi)問(wèn)題的,但是時(shí)間復(fù)雜度很高,會(huì)超時(shí)

  • 將 si 拆分成 1,2,4,8, … ,2^k, 剩余的數(shù)(這些數(shù),每個(gè)數(shù)表示一個(gè)新的物品,這個(gè)新的物品是原來(lái)的n個(gè)組合成的),這些數(shù)可以組合成 1 - si 的任意數(shù)
  • 然后應(yīng)用 01 背包解決問(wèn)題
  • 時(shí)間復(fù)雜度 O(NVlog?S)O(NV \log S )O(NVlogS),空間復(fù)雜度 O(V)O(V)O(V)
#include<bits/stdc++.h> using namespace std;int main() {int N, V, vi, wi, si, maxprice = 0;cin >> N >> V;vector<int> dp(V+1, -1);dp[0] = 0;// dp[v] 表示體積為 v 時(shí)裝的最大價(jià)值for(int i = 0; i < N; ++i){cin >> vi >> wi >> si;for(int k = 1; si > k; k*=2)//二進(jìn)制拆分{int price = wi*k;//合并成一個(gè)物品,其價(jià)值int v = vi*k;//其體積si -= k;//剩余物品數(shù)量for(int j = V-v; j >= 0; --j)// 01 背包,狀態(tài)更新{if(dp[j] == -1)//狀態(tài)不存在continue;dp[j+v] = max(dp[j+v], dp[j]+price);maxprice = max(maxprice, dp[j+v]);}}if(si > 0)//還剩余的,單獨(dú)打包成一個(gè)物品{int price = wi*si;int v = vi*si;for(int j = V-v; j >= 0; --j)// 01 背包,狀態(tài)更新{if(dp[j] == -1)//狀態(tài)不存在continue;dp[j+v] = max(dp[j+v], dp[j]+price);maxprice = max(maxprice, dp[j+v]);}}}cout << maxprice << endl;return 0; }

855 ms C++


我的CSDN博客地址 https://michael.blog.csdn.net/

長(zhǎng)按或掃碼關(guān)注我的公眾號(hào)(Michael阿明),一起加油、一起學(xué)習(xí)進(jìn)步!

總結(jié)

以上是生活随笔為你收集整理的ACwing 5. 多重背包问题 II(二进制拆分+DP)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。