牛妹的春遊(二維費用揹包 技巧)

2021-10-07 23:12:40 字數 2392 閱讀 6597

題目鏈結

題目大意

眾所周知,牛妹要組織公司的出遊。要準備麵包和飲料。她買到的麵包和飲料都是**銷售的,也就是說,乙個大包裝裡面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,而是...