揹包DP(01揹包,多重揹包,完全揹包)

2021-08-17 20:39:44 字數 1136 閱讀 5365

//從前乙個轉態轉移過來,選還是不選

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

else

f[i][j]=f[i-1][j];

}}

01揹包優化:

//滾動陣列

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

for (int j=m; j>=1; j--)

if (weight[i]<=j)

f[j]=max(f[j],f[j-weight[i]]+value[i]);

//優化成二維

int now=1,pre=0;

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

swap(now,pre);

}

2.多重揹包

//每件物品可以使用num[i]次,求最大值

//第一種

for(i = 0 ; i < m ; i++) //代表物品種類

for(k = 0 ; k < num[i] ; k++) //代表一次放一件,共放了k次

for(j = n ; j >= pri[i]; j--) //放入容量為j的揹包

f[j] = max(f[j],f[j-pri[i]]+w[i]);

//第二種

for(i = 0 ; i < m ; i++) 代表物品種類

for(j = n ; j >= pri[i]; j--) //放入容量為j的揹包

for(k = 0 ; k <= min(j/pri[i],num[i]) ; k++) //代表一次放了k件

f[j] = max(f[j],f[j-k*pri[i]]+k*w[i]);

3.完全揹包

//每件物品可以使用無數次,求最大值

memset(dp,-inf,sizeof(dp));

dp[0]=0;

for(int i=0;ifor(int j=c[i];j<=v;j++)

dp[j]=max(dp[j],dp[j-c[i]]+w[i]);

dp揹包問題(01揹包,完全揹包,多重揹包)

include includeusing namespace std const int n 1005 int v n w n int f n n int main cout 空間一維優化 第二層迴圈逆序m.v i include includeusing namespace std const i...

揹包 01揹包,完全揹包,多重揹包

哈哈 01揹包 f i v max 完全揹包 f i v max 多重揹包 f i v max include include include include include define maxn 1000 using namespace std int n,cap int w maxn 重量 花...

01揹包 完全揹包 多重揹包

01揹包 zeroonepack 有n件物品和乙個容量為v的揹包,每種物品均只有一件。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。include include includeusing namespace std const int n 1000 10 int ...