UVA 12563 揹包問題的注意問題

2021-09-10 12:30:27 字數 2555 閱讀 4352

這道題就是揹包問題。

但是我在一維陣列(滾動陣列)和二維陣列上沒理解清楚,導致出現了bug,找了好久才想出來。

二維陣列做法:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

typedef

long

long ll;

#define inf 0x3f3f3f3f

#define pi acos(-1.0)

#define pii pair

#define all(x) x.begin(),x.end()

#define mem(a,b) memset(a,b,sizeof(a))

#define per(i,a,b) for(int i = a;i <= b;++i)

#define rep(i,a,b) for(int i = a;i >= b;--i)

const

int maxn =

50,ma =

180*50;

int n =

0,t =0;

int max_time =0;

int a[maxn+10]

;struct node};

node dp[maxn+10]

[ma+10]

;void

solve()

node tmp;

tmp.num = dp[i-1]

[j-a[i]

].num +1;

tmp.time = dp[i-1]

[j-a[i]

].time + a[i]

; dp[i]

[j]=

(dp[i-1]

[j]< tmp ? tmp : dp[i-1]

[j]);}

}}intmain()

max_time =

min(t-

1,sum)

;solve()

;printf

("case %d: %d %d\n"

,++kase,dp[n]

[max_time]

.num+

1,dp[n]

[max_time]

.time +

678);}

return0;

}

滾動陣列的做法:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

typedef

long

long ll;

#define inf 0x3f3f3f3f

#define pi acos(-1.0)

#define pii pair

#define all(x) x.begin(),x.end()

#define mem(a,b) memset(a,b,sizeof(a))

#define per(i,a,b) for(int i = a;i <= b;++i)

#define rep(i,a,b) for(int i = a;i >= b;--i)

const

int maxn =

50,ma =

180*50;

int n =

0,t =0;

int max_time =0;

int a[maxn+10]

;struct node};

node dp[ma+10]

;void

solve()

node tmp;

tmp.num = dp[j-a[i]

].num +1;

tmp.time = dp[j-a[i]

].time + a[i]

;//dp[i][j] = (dp[i-1][j] < tmp ? tmp : dp[i-1][j]);

if(dp[j]

< tmp)}}

}int

main()

max_time =

min(t-

1,sum)

;solve()

;printf

("case %d: %d %d\n"

,++kase,dp[max_time]

.num+

1,dp[max_time]

.time +

678);}

return0;

}

UVA 12563 勁歌金曲 01揹包

題目鏈結 勁歌金曲 題目型別 01揹包 題解 題意 求在給定時間內,最多能唱多少歌曲,在最多歌曲的情況下,使唱的時間最長。該題類似於01揹包問題,可用01揹包問題的解題思路來求,每個歌曲相當於物品,歌曲的長度相等於物品重量,每個歌曲的 價值 為1。由於金歌勁曲時間最長,所以最後要留至少1秒時間開始唱...

UVA 624 CD 0 1揹包問題

name uva 624 cd author zj ac date 26 03 13 15 15 description 01backpack problem include include include include include using namespace std int maxval...

UVA 624 CD 01揹包問題

解題思路 01揹包問題,路徑比較難,用乙個陣列記錄,陣列儲存的是前m 1的數的和,那個和必然也是最大的,輸出的時候進行判斷,如果是小於那個數的,就不符合條件。感覺01揹包題目,如果是有限個數量的話,就用二維陣列表示狀態,如果是無限的話,就用一維的表示,uva 10465就是無限個的 include ...