01揹包優化://從前乙個轉態轉移過來,選還是不選
for (int i=1; i<=n; i++)
else
f[i][j]=f[i-1][j];
}}
//滾動陣列
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.多重揹包
3.完全揹包//每件物品可以使用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]);
//每件物品可以使用無數次,求最大值
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 ...