HDU 2639 Bone Collector II(01背包变型)
来源:互联网 发布:php sqlsrv 编辑:程序博客网 时间:2024/06/07 06:09
此题就是在01背包问题的基础上求所能获得的第K大的价值。
具体做法是加一维去推当前背包容量第0到K个价值,而这些价值则是由dp[j-w[ i ] ][0到k]和dp[ j ][0到k]得到的,其实就是2个数组合并之后排序,但是实际做法最好不要怎么做,因为你不知道总共有多少种,而我们最多只需要前K个大的就行了(因为可能2个数组加起来的组合数达不到K个),如果全部加起来数组开多大不清楚,所以可以选用归并排序中把左右2个有序数组合并成一个有序数组的方法来做,就是用2个变量去标记2个有序数组的头,然后比较,选了这个就这个变量加加,唯一不同的是不能有重复的,那么可以用一个很巧妙的办法,就是在循环结束前判断要加进去的数是否跟前一个一样,如果不一样才加加。
AC代码:
#include<cstdio>#include<ctype.h>#include<algorithm>#include<iostream>#include<cstring>#include<vector>#include<stack>#include<cmath>#include<queue>#include<set>#include<ctime>using namespace std;#define push_back pbint w[105],vol[105],vis[1005];int dp[1005][35];int main(){// freopen("input.txt","r",stdin);// freopen("o1.txt","w",stdout); int i,j,k,t,n,v,K; scanf("%d",&t); while(t--) { memset(dp,0,sizeof(dp)); scanf("%d%d%d",&n,&v,&K); for(i = 0; i < n; i++) scanf("%d",&w[i]); for(i = 0; i < n; i++) scanf("%d",&vol[i]); for(i = 0; i <= v; i++) vis[i] = 1; int temp[40]; for(i = 0; i < n; i++) { for(j = v; j >= vol[i]; j--) { memset(temp,0,sizeof(temp)); int a = 1,b = 1; k = 1; while((a<=vis[j-vol[i]] || b<=vis[j]) && k <= K) { if((dp[j-vol[i]][a]+w[i] > dp[j][b] && a <= vis[j-vol[i]]) || b > vis[j]) { temp[k] = dp[j-vol[i]][a]+w[i]; a++; } else { temp[k] = dp[j][b]; b++; } if(temp[k] != temp[k-1]) k++; } vis[j] = k; for(k = 1; k <= vis[j]; k++) dp[j][k] = temp[k]; } } printf("%d\n",dp[v][K]); } return 0;}
0 0
- HDU 2639 Bone Collector II(01背包变型)
- HDU 2639 - Bone Collector II(01背包)
- HDU--2639--Bone Collector II--01背包
- 【HDU-2639】Bone Collector II(背包)
- Hdu 2639 Bone Collector II (01背包第k优解)
- hdu 2639Bone Collector II 01背包第k大问题
- HDU 2639 Bone Collector II(DP:01背包)
- hdu 2639 Bone Collector II 01背包第K优解
- HDU 2639 Bone Collector II 01背包第K优解
- hdu oj 2639 Bone Collector II (01背包k优解)
- HDU - 2639 Bone Collector II(第K大01背包)
- hdu 2639 Bone Collector II (01背包)
- hdu 2639 Bone Collector II 01背包 第k优解
- hdu 2639 Bone Collector II 第k大01背包
- HDU 2639 Bone Collector II 01背包第k优解
- Bone Collector II HDU - 2639 01背包,第k优解
- HDU 2639 Bone Collector II(01背包第K大解)
- HDU-2639 Bone Collector II(01背包k解问题)
- 黑马程序员17.File&Properties
- comm比较两个文件的异同
- Equal Sum Sets
- ActivityGroup打开空文件夹焦点问题及返回键问题
- phpstudy apache无法启动解决方法,phpstudy教程,动态IP无公网IP时phpstudy网站发布到外网
- HDU 2639 Bone Collector II(01背包变型)
- Collection , List , Set 和 Map 用法和区别
- xUtils
- 程序员应戒除一些坏习惯
- 二叉树的建造、递归与非递归遍历
- ehcache监听工厂
- android中Timer和TimerTask的应用
- 非阻塞模式
- GetDocument()