題目鏈結
題目大意
眾所周知,牛妹要組織公司的出遊。要準備麵包和飲料。她買到的麵包和飲料都是**銷售的,也就是說,乙個大包裝裡面x個麵包+y個飲料,花費t元。為了滿足公司的要求,需要一定數量的麵包和飲料。你的任務就是幫助牛妹計算,為了滿足公司需要,一共最少花費多少錢。
輸入樣例
5 60 5
3 36 120
10 25 129
5 50 250
1 45 130
4 20 119
輸出樣例
分析d[j
][k]
=min
(d[j
][k]
,d[m
ax(j
−a[i
][0]
,0)]
[max
(k−a
[i][
1],0
)]+a
[i][
2]);
d[j][k]=min(d[j][k],d[max(j-a[i][0],0)][max(k-a[i][1],0)]+a[i][2]);
d[j][k
]=mi
n(d[
j][k
],d[
max(
j−a[
i][0
],0)
][ma
x(k−
a[i]
[1],
0)]+
a[i]
[2])
; 也就是說如果容量減到負數了,就從0轉移,這樣即使拿了更大的容量也不會陣列越界,轉移也是正確的。當然此題還要滾動陣列優化
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ins insert
#define lowbit
(x)(x&
(-x)
)#define mkp
(x,y)
make_pair
(x,y)
#define mem
(a,x)
memset
(a,x,sizeof a)
;typedef long
long ll;
typedef long
double ld;
typedef unsigned long
long ull;
typedef pair<
int,
int>
p;const
double eps=
1e-8
;const
double pi=
acos(-
1.0)
;const
int inf=
0x3f3f3f3f
;const ll inf=
1e18
;const
int mod=
1e9+7;
const
int maxn=
2e5+10;
struct nodea[
2020];
int d[
2020][
2020];
intmain()
memset
(d,0x3f
,sizeof d)
; d[0]
[0]=
0;for(
int i=
0;i)for
(int j=n;j>=
0;j--
)for
(int k=m;k>=
0;k--
) d[j]
[k]=
min(d[j]
[k],d[
max(j-a[i]
.x,0)]
[max
(k-a[i]
.y,0)]
+a[i]
.t);
cout<[m]
}
二維費用揹包專題
在01揹包的基礎上多列舉一維即可。需要注意的是,題目中有隱含條件,比如人數最多選m mm人,因此人數也將成為一維。當然多維費用揹包也可以模擬二維。題解二維費用揹包板子 include define m 1009 using namespace std int a m b m c m f m m n,...
二維費用的揹包問題
問題 二維費用的揹包問題是指 對於每件物品,具有兩種不同的費用 選擇這件物品必須同時付出這兩種代價 對於每種代價都有乙個可付出的最大值 揹包容量 問怎樣選擇物品可以得到最大的價值。設這兩種代價分別為代價1和代價2,第i件物品所需的兩種代價分別為a i 和b i 兩種代價可付出的最大值 兩種揹包容量 ...
二維費用的揹包問題
題目 toj3596 題意 有n張光碟,每張光碟有乙個價錢,現在要從n張光碟中買m張,預算為l,每張光碟有乙個快樂值,要求在不超過預算並且恰好買m張,使得快樂值最大。解答 典型的二維費用揹包問題,另外一種隱含的費用為個數,每個物品的個數費用為1。要求恰好買m張表示要求恰好裝滿,所以初始化不是0,而是...