题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2639
题意:求01背包的第k优解
dp(i, j)表示容量为j时的i优解
对于第二维的操作和01背包几乎一样,只是我们只需要关注每一次取的前k大个即可。
1 #include <algorithm> 2 #include <iostream> 3 #include <iomanip> 4 #include <cstring> 5 #include <climits> 6 #include <complex> 7 #include <fstream> 8 #include <cassert> 9 #include <cstdio> 10 #include <bitset> 11 #include <vector> 12 #include <deque> 13 #include <queue> 14 #include <stack> 15 #include <ctime> 16 #include <set> 17 #include <map> 18 #include <cmath> 19 20 using namespace std; 21 22 const int maxn = 1010; 23 int n, m, k; 24 int v[maxn], w[maxn]; 25 int dp[maxn][maxn]; 26 int d[maxn]; 27 28 int main() { 29 freopen("in", "r", stdin); 30 int T; 31 scanf("%d", &T); 32 while(T--) { 33 scanf("%d%d%d", &n, &m, &k); 34 for(int i = 0; i < n; i++) { 35 scanf("%d", &v[i]); 36 } 37 for(int i = 0; i < n; i++) { 38 scanf("%d", &w[i]); 39 } 40 memset(dp, 0, sizeof(dp)); 41 for(int i = 0; i < n; i++) { 42 for(int j = m; j >= w[i]; j--) { 43 int cnt = 0; 44 for(int p = 1; p <= k; p++) { 45 d[cnt++] = dp[p][j]; 46 if(j - w[i] >= 0) { 47 d[cnt++] = dp[p][j-w[i]] + v[i]; 48 } 49 } 50 sort(d, d+cnt, greater<int>()); 51 cnt = unique(d, d+cnt) - d; 52 int q = 1; 53 for(int p = 0; p < cnt; p++) { 54 dp[q++][j] = d[p]; 55 } 56 } 57 } 58 printf("%d\n", dp[k][m]); 59 } 60 return 0; 61 }
时间: 2024-10-11 02:09:18