41 01揹包 記錄方案

2021-08-28 19:45:14 字數 854 閱讀 3433

output

optimal solutions, output any one of them.

1 dp[j] j表示的是我們用包裡面j的容量會產生最大的價值,這個時候,包內剩餘的容量是c-j;

如果是我們想要拿第i個物品來更新j的狀態的話我們會有,這個狀態的最大dp[j-[i].v],並且對於這個

狀態包內剩餘的空間是c-(j-[i].v);

一般01揹包的最大效益與物品排放的順序是沒有關係的,但是這裡放東西的前提是我們必須先有足夠大

的空間,那麼我們放的順序如果是不同的話就會出現不同的價值;

按照d-s值從大到小排序,我們可以這麼想d-s很大的話,d一定很大,s很小如果我們前面不加入的話,後面它的可以用的體積減小了,就更不可能加上了;所以放的話一定是在前面放;

對於某乙個體積下產生的最大值要放的物品數目是一定的,我們要記錄狀態的轉移,這裡我們可以用vector來記錄一下;

#include using namespace std;

const int max = 1e5+10;

typedef long long ll;

struct node p[max];

bool cmp(node a, node b)

ll dp[max];

vector pre[max];

int main()

sort(p+1,p+1+n,cmp);

for(int i=1;i<=n;i++)

}printf("%d\n",ans);

int len=pre[id].size();

for(int i=0;ireturn 0;

}

揹包9講 求揹包問題的方案

0 1揹包問題的方案 主要思路 先把所有的狀態求出來,再反推我們的方案 include include using namespace std const int maxn 1005 int w maxn 價值 int v maxn 物品所佔體積 int f maxn f i j 揹包容量為j下可選...

揹包問題求方案數 揹包問題求具體方案

在01揹包的基礎上要求出最優解的方案數 具體的方案 揹包問題求方案數 題目鏈結 解題思路 我們可以設定乙個與陣列f功能類似的陣列g,其中f i 儲存的是體積等於i的最優解 這裡是等於,之前的部落格說的是小於等於,原因後面會說 而g i 儲存的是體積等於i時的最優解的方案數,而f i 為什麼儲存的是等...

求解揹包具體方案

有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出 字典序最小的方案。這裡的字典序是指 所選物品的編號所構成的序列。物品的編號範圍是 1 n。123 4567 891...