動態規劃 勁歌金曲

2021-08-07 20:20:47 字數 1590 閱讀 7231

題意:

給n首歌和乙個時間t,最後一首歌必須是勁歌金曲(這首歌的時間是678s),要求t時間內唱的歌的數目最多的前提下使唱的時間最大。

01揹包問題,只不過決策時有兩個條件,歌的數目和唱的時間

設定dp[i][j]表示在前i首歌,剩餘j時間時所能唱的最大時間

ans[i][j]表示在前i首歌,剩餘j時間時所能唱的歌的最大數目

值得注意的是所有歌的總時間是大於t的所以可以將歌的總時間加起來和t-1比較取較小的那個,至於為什麼是t-1,那是因為至少要留一秒來唱勁歌金曲。。。

狀態轉移式看**

第一次寫的**比較醜。。。

但還是ac了, 時間是20ms

#include #include #include #include #include #include #include #include #include #define inf 0x3f3f3f3f

#pragma comment(linker, "/stack:102400000,102400000")

using namespace std;

const int maxn=51;

const int maxt=10000;

int dp[maxn][maxt];

int ans[maxn][maxt];

int k[maxn];

int n, t;

int main()

t=min(t-1, sum);

for(int i=1; i<=n; i++)

continue;

}dp[i][j]=dp[i-1][j];

ans[i][j]=ans[i-1][j];

if(j>=k[i])

else

if(num==ans[i][j])

dp[i][j]=max(dp[i][j], v);}}

}printf("case %d: %d %d\n", cas, ans[n][t]+1, dp[n][t]+678);

}return 0;

}

看上去比較舒服的ac** 時間是0ms

#include #include #include #include #include #include #include #include #include #define inf 0x3f3f3f3f

#pragma comment(linker, "/stack:102400000,102400000")

using namespace std;

const int maxn=51;

const int maxt=10000;

struct node

{ int num;

int len;

friend bool operator <(node a, node b)

{if(a.num==b.num)

return a.len=k[i]; j--)

{node tmp;

tmp.num=dp[j-k[i]].num+1;

tmp.len=dp[j-k[i]].len+k[i];

if(dp[j]

動態規劃 Jin Ge Jin Qu 勁歌金曲

description 如果問乙個麥霸 你在ktv裡必唱的曲目有哪些?得到的答案通常都會包含一首 神曲 古巨基的 勁歌金曲 為什麼呢?一般來說,ktv不會在 時間到 的時候魯莽地把正在唱的歌切掉,而是會等它放完。例如,在還有15秒時再唱一首2分鐘的歌,則實際上多唱了105秒。但是融合了37首歌曲的 ...

uva 12563 勁歌金曲

題目大意 你在ktv唱歌,有乙個時限,但是在時限到時,若一首歌沒唱完可以繼續唱,已知有n首歌可以唱,已知他們的時長每個都不超過3分鐘 不能重複唱一首歌。還有一首678秒的歌,歌之間可以無縫銜接 思路 典型的揹包問題 求這n首歌能達到不超過t 1的時間 t 1是因為要留出1秒來開始那個巨長的歌 1 i...

UVA 12563 勁歌金曲 01揹包

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