題目背景:物品被分為多組,每組只能選乙個
解決方法:詳見下方**
題解分組揹包板子
**
#include
#define m 109
using
namespace std;
intread()
for(
;isdigit
(ch)
;ch=
getchar()
) re=
(re<<3)
+(re<<1)
+ch-
'0';
return re*f;
}int n,m,f[m]
,a[m]
[m];
intmain()
return0;
}
題解
嚴格意義來說,本題不屬於分組揹包,它並沒有每組只能選乙個的限制,相反它的限制是每組至少選乙個,那麼其實直接寫成:
f [i
][j]
=max
(f[i
][j]
,f[i
][j−
w[i]
[k]]
+a[i
][k]
,f[i
−1][
j−w[
i][k
]]+a
[i][
k]
f[i][j]=max(f[i][j],f[i][j-w[i][k]]+a[i][k],f[i-1][j-w[i][k]]+a[i][k]
f[i][j
]=ma
x(f[
i][j
],f[
i][j
−w[i
][k]
]+a[
i][k
],f[
i−1]
[j−w
[i][
k]]+
a[i]
[k]f[i
][j]
f[i][j]
f[i][j
]表示前i
ii組物品花了j
jj容量得到的最大價值
w [i
][k]
w[i][k]
w[i][k
]表示第i
ii組中第k
kk件物品的重量
v [i
][k]
v[i][k]
v[i][k
]表示第i
ii組中第k
kk件物品的價值
同時注意初始化,因為除了起始狀態,其餘狀態都為不合法狀態
**
#include
#define m 100009
using
namespace std;
intread()
for(
;isdigit
(ch)
;ch=
getchar()
) re=
(re<<3)
+(re<<1)
+ch-
'0';
return re*f;
}int f[12]
[m],a[12]
[m],n,m,tot[12]
,k,b[12]
[m],w;
intmain()
memset
(f,-1,
sizeof
(f))
;for
(int i=
1;i<=m;i++
) f[0]
[i]=0;
for(
int i=
1;i<=w;i++
)for
(int k=
1;k<=tot[i]
;k++
)for
(int j=m;j>=
0;j--)if
(f[w]
[m]<0)
printf
("impossible\n");
else
printf
("%d\n"
,f[w]
[m]);}
return0;
}
題解
分組揹包板子
**
#include
using
namespace std;
intread()
for(
;isdigit
(ch)
;ch=
getchar()
) re=
(re<<3)
+(re<<1)
+ch-
'0';
return re*f;
}int m,n,w[
109]
[1009
],f[
50009
],v[
109]
[1009
],tot[
109]
,k;int
main()
for(
int i=
1;i<=k;i++
)for
(int k=m;k>=
0;k--
)for
(int j=
1;j<=tot[i]
;j++)if
(k>=w[i]
[j]) f[k]
=max
(f[k]
,f[k-w[i]
[j]]
+v[i]
[j])
;printf
("%d\n"
,f[m]);
return0;
}
九大揹包問題專題 分組揹包問題
問題 有n組物品和乙個容量是v的揹包。第組物品有若干個,同一組內的物品最多只能選乙個每件物品的體積是vij,價值是wij。其中i是組號,j是組內編號。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包的容量,且價值總和最大。輸出最大價值 輸入格式 第一行有兩個整數,n,v用空格隔開,分別表示物品...
通天之分組揹包 分組揹包
本人水平有限,題解不到為處,請多多諒解 本蒟蒻謝謝大家 題目 傳送門 分組揹包的模板 偽 1 for int i 1 i 組數 i 6 7 直接套模板即可。code 1 include2 pragma gcc optimize 3 3const int n 1e5 10 4 using namesp...
揹包專題 01揹包
暑假集訓開始了,按照隊裡的分配,我是弄dp的,嘛,於是我又一次的開始了從01揹包開始學習,昨天將杭電的幾道01揹包重新做了一遍,下面講講我自己對於01揹包的理解。首先01揹包題目的雛形是 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。...