01揹包變式 要求恰好裝滿的01揹包

2021-10-25 11:34:30 字數 1137 閱讀 4901

ktv裡面有n首歌曲你可以選擇,每首歌曲的時長都給出了. 對於每首歌曲,你最多只能唱1遍. 現在給你乙個時間限制t (t<=10^9) , 問你在最多t-1秒的時間內可以唱多少首歌曲num , 且最長唱歌時間是多少time (time必須<=t-1) ? 最終輸出num+1 和 time+678 即可.

注意: 你需要優先讓歌曲數目最大的情況下,再去選擇總時長最長的.

別看給的時間是1e9,因為每一首歌不超過180,而且最多就50首歌,所以其實最多時間也就9000,也就不需要考慮時間問題。

這其實是乙個恰好裝滿的問題,因為問的是唱歌的時間,不然就是直接 給的剩餘時間 -1 + 678就行,因為是以讓歌曲數目最多為第一目的,所以我們要找到 t - 1內的最多的歌曲數目,並要求這個曲目數量時,這些歌必須裝滿相對應包(因為是問的唱的歌的總時間,所以要求對應的包必須裝滿)

所以我們要求出恰好裝滿時的最大歌曲數和這個歌曲的總時間

我們規定 dp[j] 是 剩餘時間為 j  時 恰好能裝滿 j 時的歌曲數量,然後我們倒著進行列舉 從t - 1開始

找到歌曲數量最大的有效狀態,並記錄此時的容量,因為是有效狀態,所以,這個包裡一定是裝滿的,也就是說

這個包的容量就等於列舉到的這個數字

由於是列舉的有效狀態,所以找到最大歌曲數量之後 + 1輸出,並直接把容量也跟著 + 678輸出即可

code

#include #define ss system("pause");

using namespace std;

const int maxn = 5e1 + 5;

const int inf = 0x3f3f3f3f;

const int maxc = maxn * 180 + 678;

int dp[maxc],v[maxn];

int main()

if(dp[j] < 0) dp[j] = -inf;}}

int maxx = 0,ans = 0;

for(int i = c - 1; i >= 0; i--)

}printf("case %d: %d %d\n",k,maxx + 1,ans + 678);

}//ss

return 0;

}

01揹包的變形問題 揹包恰好裝滿

在看本文之前建議先看一下我之前發過的01揹包詳解。在前面講到的01揹包問題中,現在我們把條件改為 求當揹包恰好裝滿時候取得的最大價值 這樣的問題其實本質上和原始的01揹包問題區別不大,我們只需要做出一點小小的調整。需要指出的是該問題其實可分為兩個問題。1 揹包能否恰好裝滿?2 如果能恰好裝滿,恰好裝...

QDUOJ 分辣條 01揹包恰好裝滿情況

描述 你喝的酸奶是我買的,辣條也是我買的,你現在要跟我分手,你把我當什麼?因為你每次分辣條的時候都比我多一根!可見分好辣條是一件多麼重要的事情。現在有n 1 n 200 根辣條,每根辣條的重量為a1,a2.ai.an 1 ai 100 那麼能不能把這些辣條分為重量相等的兩份呢?輸入輸入有多組資料。每...

01揹包中揹包裝滿和不裝滿

揹包 有n 種不同的物品,每個物品有兩個屬性,v體積,c價值,現在給乙個體積為 m 的揹包,問 最多可帶走多少價值的物品。狀態轉移方程 dp i j max dp i 1 j dp i 1 j v i c i dp i 1 j 表示不放第i件物品的最大價值,dp i 1 j v i c i 表示放第...