題意:
給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秒時間開始唱...