gate
求01揹包前k優解的價值和(題面還挺親切的)
本來我想的是直接邊跑01揹包邊記錄,最後排序...
然後意識到,這種方法是列舉不全的。
看了眼題解...要多開一維!
k的範圍很小,f[i][j]表示空間為i,是第j優解。
那麼,因為有許多j,所以對於每個不一樣的j,
f[i][j]既可能從f[i-c][...]+w轉移過來,也可能從f[i][...]轉移過來。
用類似於歸併排序的方法:
維護兩個指標t1,t2;
同時為了防止新的f覆蓋原來的影響後續的狀態轉移,
用乙個臨時的g記錄,最後再轉移過去。
那麼就有g[t] = max(f
[j-c][t1++]+w,
f[j][t2++])
最後答案統計f[m][1-k]就可以了。
**如下
#include#includeview code#include
#include
#define mogeko qwq
#define darcy amour
using
namespace
std;
const
int maxn = 1e5+10
;const
int inf = 0x3f3f3f3f
;int k,m,n,c,w,ans,f[maxn][60],g[60
];int
main()
for(int t = 1; t <= k; t++)
f[j][t] =g[t];}}
for(int i = 1; i <= k; i++)
ans +=f[m][i];
printf("%d
",ans);
return0;
}
luoguP1858 多人揹包
題目鏈結 分析 首先要宣告,題目有一些描述不準確的地方 這是一道01揹包k優解的問題 唯一的不同就是 揹包必須裝滿 實際上這個問題也非常好解決 如果我們不要求裝滿,取的是最大值,那麼f的初始值就是0 如果要求裝滿,那麼f的初始值就是 inf,其中f 0 0 怎麼理解呢 初始化的f陣列實際上就是在沒有...
Luogu P1858 多人揹包
p1858 多人揹包 求 01 揹包前 k 優解的價值和 第一行三個數 k v n 接下來每行兩個數,表示體積和價值 前 k 優解的價值和 2 10 5 3 12 7 20 2 45 6 1 157對於 100 的資料,k leq 50,v leq 5000,n leq 200 讓我先秒了這道水題。...
P1858 多人揹包
求01揹包前k優解的價值和 輸入格式 第一行三個數k v n 接下來每行兩個數,表示體積和價值 輸出格式 前k優解的價值和 輸入樣例 1 2 10 5 3 12 7 20 2 45 6 1 1 輸出樣例 1 57 對於100 的資料,k 50,v 5000,n 200 solution 本題由於需要...