01背包(求前一个的最大价值-->求前K个的最大价值) 之 hdu 2639
来源:互联网 发布:step7软件下载 编辑:程序博客网 时间:2024/06/11 10:28
// [7/21/2014 Sjm]/*此题我想的思路错了,情况考虑漏了。。。 解法是由 求前一个的最大价值-->求前K个的最大价值 的转化。 求前一个最大价值: dp[i][j] = max(dp[i-1][j], dp[i-1][j-C[i]] + W[i])求前K个的最大价值 同样,dp[i][j]的前 k 个最大价值,是依赖于 dp[i-1][j] 的前 k 个最大价值和 dp[i-1][j-C[i]] 的前 k 个最大价值所求得的。 由此考虑了所有情况,求出了答案。 */#include <iostream>#include <cstdlib>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int MAX = 100005;const int MAX_N = 105;const int MAX_K = 35;int N, V, K;int arr[MAX_N][2], dp[MAX][MAX_K];int tep1[MAX_K], tep2[MAX_K];int Solve() {memset(dp, 0, sizeof(dp));for (int i = 1; i <= N; ++i) {for (int j = V; j >= arr[i][1]; --j) { for (int k = 1; k <= K; ++k) {// 注意:经过此循环,tep1[], tep2[]均是递减排列的。(根据01背包的原理)tep1[k] = dp[j - arr[i][1]][k] + arr[i][0];tep2[k] = dp[j][k];}tep1[K + 1] = tep2[K + 1] = -1;int pos1 = 1, pos2 = 1;for (int k = 1; (pos1 <= K || pos2 <= K)&&k <= K;) {if (tep1[pos1] > tep2[pos2]) { dp[j][k] = tep1[pos1++]; }else { dp[j][k] = tep2[pos2++]; }if (dp[j][k] != dp[j][k - 1]) {++k;}}}}return dp[V][K];}int main(){//freopen("input.txt", "r", stdin);//freopen("output.txt", "w", stdout);int T;scanf("%d", &T);while (T--) {scanf("%d %d %d", &N, &V, &K);for (int i = 1; i <= N; ++i) {scanf("%d", &arr[i][0]);}for (int i = 1; i <= N; ++i) {scanf("%d", &arr[i][1]);}printf("%d\n", Solve());}return 0;}
0 0
- 01背包(求前一个的最大价值-->求前K个的最大价值) 之 hdu 2639
- hdu 1561 选某个物品前必须选特定的其它物品,求最大价值
- hdu2639(求价值第K大的01背包)
- Top K问题(求前k个最大的数)
- 使用优先级队列求一个大数组中的前k个最大的数(或前k个最小的数)
- 求最大价值
- 利用堆求最大或最小的前k个数
- ms 两个数组,从每个数组中取一个数相加,求最大的前k个和
- 求100W个数中的前K个最大的数
- 数据结构与算法求前k个最大或者最小值
- 求矩阵左上角到右下角路径的最大价值
- 求前k个大的数据
- hdu 3127 二维完全背包,长方形布料剪裁求最大价值
- 背包系列第二篇----01背包(求解最大价值时背包的物品)
- 求第K个最大的数
- 求最大的K个值
- 背包系列第三篇----01背包(求解最大价值的个数)
- 典型的Top K算法_找出一个数组里面前K个最大数
- UDP广播与多播简单实现
- 《head first设计模式》阅读记录——设计模式入门
- Android开发环境的搭建
- 街上Google地图下载代码实现
- eclipse的自动提示功能设置方法
- 01背包(求前一个的最大价值-->求前K个的最大价值) 之 hdu 2639
- 第一次开通博客!
- [小技巧] 使用Google Proxy Resources加速檔案下載速度!
- 在CI框架下实现验证码登录
- 给在读研究生的一封信(写的好)!!!
- codeforces C. Ancient Berland Circus
- 拉格朗日对偶(Lagrange duality)
- 最短路
- uva 219 - Department of Redundancy Department(dfs+剪枝)