SDUTOJ 3307 (01背包求第K大)
来源:互联网 发布:中国最新军装淘宝 编辑:程序博客网 时间:2024/05/18 00:00
a
Time Limit: 1000MS Memory limit: 65536K
题目描述
有一个奇怪的超市,超市中有m种商品,每个商品都有一个都价格pi,超市的特殊在于:如果顾客买第i件商品,就会赠送ci个欢乐豆,一种商品对一个顾客只会赠送一次。现在有两个好朋友来超市买东西,他们都带了n元钱,如果最终两个人得到的欢乐豆不一样,他们的欢乐豆的和的最大值是多少?
输入
首先输入一个正整数T (T<10),测试数据有T组。
对于每组测试数据的第一行有两个整数n,m ( 1 <= n,m <= 1000)。之后有m行,每行两个数字p c,代表第i件商品的价格是p,赠送的欢乐豆的数量c(1 <= p,c <= 1000).
输出
输出一个整数,表示两个人获得的欢乐豆的和的最大值。
示例输入
110 32 33 55 8
示例输出
29
提示
第一个人可以买第1,2,3种商品,得到的欢乐豆是16,第二个人也可以买1,2,3这三种商品,但是不能和第一个人得到的欢乐豆一样,所以最多可以得到13个欢乐豆。
来源
windream
示例程序
#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;int p[1005],w[1005];int n,v,dp[1005][31] = {0},a[5],b[5];int main() { int t; scanf("%d",&t); while(t--) { int k = 2; scanf("%d%d",&v,&n); memset(dp,0,sizeof(dp)); for(int i = 0; i<n; i++) { scanf("%d%d",&p[i],&w[i]); } for(int i = 0; i<n; i++) { for(int j = v; j>=p[i]; j--) { int cnt = 0,d; for(d = 1; d<=k; d++) { a[d] = dp[j-p[i]][d]+w[i]; b[d] = dp[j][d]; } int x,y,z; x = y = z = 1; a[d] = b[d] = -1; while(z<=k && (x<=k || y<=k)) { if(a[x] > b[y]) { dp[j][z] = a[x]; x++; } else { dp[j][z] = b[y]; y++; } if(dp[j][z]!=dp[j][z-1]) z++; } } } if(dp[v][1] == dp[v][2]) { printf("%d\n",dp[v][1]); } else { printf("%d\n",dp[v][1] + dp[v][2]); } } return 0;}
0 0
- SDUTOJ 3307 (01背包求第K大)
- SDUTOJ 3307 a(k大背包)
- 【SDUTOJ 3307】 a (第k小背包)
- hdu2639(求价值第K大的01背包)
- hdu2639----求第k大01背包模板题
- 背包问题--求第K大值
- 01背包第k大
- hdu 2639Bone Collector II(01背包求第k大)
- hdu2639-01背包(第k大背包问题)
- hdu2639(01背包变形-第k大背包)
- hdu2639(01背包求第k优解)
- HDU-2639(01背包+求第k个最大值)
- hdu 2639求背包第K大值
- hdu2639(第k大值+01背包)
- hdu2639(01背包的第K大)
- 01背包第k大价值hdu2639
- hdu 2639 Bone Collector II 01背包问题 求第K大最优值。。
- HDU 2639 Bone Collector II(01背包 求第k大)
- Canvas和Bitmap的关系
- HashSet
- 物理地址和虚拟地址的区别
- mac os x 端口转发(80)
- 为ESXi配置存储
- SDUTOJ 3307 (01背包求第K大)
- HDOJ 4548 美素数
- STL源码剖析 [容器](七)[stl_heap.h]
- HDU 2054 A == B ?(水~)
- disk boot info
- oracle 12c rac 安装检测错误 Device Checks for ASM
- 欢迎使用CSDN-markdown编辑
- 初步10-分离各位数
- HDOJ 4463 Outlets 最短路