HDU2639[背包第K大]
题目链接【http://acm.hdu.edu.cn/showproblem.php?pid=2639】
题意:求第k大背包。
题解:利用二路归并的思想,求解第K大的值。
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int MAXN = 1050; int dp[MAXN][35], w[MAXN], v[MAXN]; int N, W, K; int A[35], B[35]; void super_kth() { for(int i = 1; i <= N; i++) { for(int j = W; j >= w[i]; j--) { for(int l = 1; l <= K; l++) { A[l] = dp[j - w[i]][l] + v[i]; //放i B[l] = dp[j][l];//不放i } int nu = 1, x = 1, y = 1; A[K + 1] = -1; B[K + 1] = -1; while(nu <= K && (A[x] != -1 || B[y] != -1)) { if(A[x] > B[y]) dp[j][nu] = A[x++]; else dp[j][nu] = B[y++]; if(dp[j][nu] != dp[j][nu - 1])//不相等的第k大背包 nu++; } } } printf("%d\n", dp[W][K]); } int main () { int T; scanf("%d", &T); while(T--) { memset(dp, 0, sizeof(dp)); scanf("%d%d%d", &N, &W, &K); for(int i = 1; i <= N; i++) scanf("%d", &v[i]); for(int i = 1; i <= N; i++) scanf("%d", &w[i]); super_kth(); } return 0; }
想的太多,做的太少。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步