嗯……這道題其實還是挺簡單的……
然後我就不會做了qaq
實際上就是設
f[i][j][k]為第i個物品,容量為j,第k個揹包的價值。
那麼則有f[i][j][p] =
f[i - 1][j - w[i]][1…k] + val[i]與f[i - 1][j][1…k]的第p個
然後因為我懶了一下……
我想:
誒?詢問最大值?
前k大?
然後搞了個堆下來……
然後就tle了tat
(話說我好像用堆就從來沒有用對過……
#include
#include
#include
#include
#include
#define rep(i,n) for(int i = 1;i <= n;i ++)
#include
#define clr(a,b) memset(a,b,sizeof(a))
using
namespace
std;
int k,n,m,f[5005][55],val[205],w[205];
void merge(int now,int hv)
rep(i,k)f[hv][i] = tmp[i];
}int main ()
int ans = 0;
rep(i,k)ans += f[m][i];
printf("%d\n",ans);
return
0;}
hdu 2639 第k大01揹包
求每個狀態裡的k優解,然後合併 hdu 2639 求01揹包的第k大解。合併兩個有序序列 include include include include using namespace std const int maxn 110 int dp 1010 50 dp i j 表示容量為i,第j大的值...
hdu2639(01揹包變形 第k大揹包)
01揹包變形 求第k大揹包 多開一維 k 兩種情況分別放在a,b兩個陣列裡,將ab合併 即從小到大排序 取第k大 開乙個大小為k的陣列f i v 1.k 其中f i v k 表示前i個物品 揹包大小為 v時,第k優解的值。可以理解成,由f i 1 v 和f i 1 v c i w i 這兩個有序佇列...
大揹包問題(01揹包)
大揹包問題 有n乙個重量和 值分別w i 和v i 專案。出的這些產品中的總重量不超過w專案。查詢所有選定的方案 值的最大總和值。其中,1 n 40,1 w i v i 10 15,1 w 10 15.這個問題給人的第一感覺就是普通的01揹包。只是,看完資料範圍會發現。這次價值和重量都能夠是很大的數...