Happy Programming Contest


Time Limit: 2 Seconds      Memory Limit: 65536 KB


In Zhejiang University Programming Contest, a team is called "couple team" if it consists of only two students loving each other. In the contest, the team will get a lovely balloon with
unique color for each problem they solved. Since the girl would prefer pink balloon rather than black balloon, each color is assigned a value to measure its attractiveness. Usually, the boy is good at programming while the girl is charming. The boy wishes
to solve problems as many as possible. However, the girl cares more about the lovely balloons. Of course, the boy's primary goal is to make the girl happy rather than win a prize in the contest.

Suppose for each problem, the boy already knows how much time he needs to solve it. Please help him make a plan to solve these problems in strategic order so that he can maximize the
total attractiveness value of balloons they get before the contest ends. Under this condition, he wants to solve problems as many as possible. If there are many ways to achieve this goal, he needs to minimize the total penalty time. The penalty time of a problem
is equal to the submission time of the correct solution. We assume that the boy is so clever that he always submit the correct solution.

Input

The first line of input is an integer N (N < 50) indicating the number of test cases. For each case, first there is a line containing 2 integers T (T <=
1000) and n (n <= 50) indicating the contest length and the number of problems. The next line contains n integers and the i-th integer ti (ti <= 1000) represents the time
needed to solve the ith problem. Finally, there is another line containing n integers and the i-th integer vi (vi <= 1000) represents the attractiveness value of the i-th problem.
Time is measured in minutes.

Output

For each case, output a single line containing 3 integers in this order: the total attractiveness value, the number of problems solved, the total penalty time. The 3 integers should be
separated by a space.

Sample Input

2
300 10
10 10 10 10 10 10 10 10 10 10
1 2 3 4 5 6 7 8 9 10
300 10
301 301 301 301 301 301 301 301 301 301
1000 1000 1000 1000 1000 1000 1000 1000 1000 1000

Sample Output

55 10 550
0 0 0

题目的意思是给出总时间和题目的数量,每道题有花费时间和价值,求价值最大是多少,价值最大不唯一时,按题目数量多的排,题目数量也一样按罚时少的排

思路:01背包,加上相等时判定的更新即可

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <set>
#include <stack>
#include <map>
#include <cctype>
#include <sstream>
#include <climits> using namespace std; #define LL long long
const int INF=0x3f3f3f3f;
int mod=1e9+7; struct node{
int val,num,t,sum;
}dp[1005]; struct pro{
int w,v;
}p[100]; bool cmp(pro a,pro b)
{
if(a.w!=b.w)
return a.w<b.w;
return a.v>b.v;
} int main()
{
int T,m,n;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&m,&n);
for(int i=0;i<n;i++)
scanf("%d",&p[i].w);
for(int i=0;i<n;i++)
scanf("%d",&p[i].v); memset(dp,0,sizeof dp);
sort(p,p+n,cmp);
for(int i=0;i<n;i++)
{
for(int j=m;j>=p[i].w;j--)
{
if(dp[j].val<dp[j-p[i].w].val+p[i].v)
{
dp[j].val=dp[j-p[i].w].val+p[i].v;
dp[j].num=dp[j-p[i].w].num+1;
dp[j].t=dp[j-p[i].w].t+p[i].w;
dp[j].sum=dp[j-p[i].w].sum+dp[j].t;
}
else if(dp[j].val==dp[j-p[i].w].val+p[i].v)
{
if(dp[j].num<dp[j-p[i].w].num+1)
{
dp[j].num=dp[j-p[i].w].num+1;
dp[j].t=dp[j-p[i].w].t+p[i].w;
dp[j].sum=dp[j-p[i].w].sum+dp[j].t;
}
else if(dp[j].num==dp[j-p[i].w].num+1)
{
if(dp[j].sum>dp[j-p[i].w].sum+dp[j-p[i].w].t+p[i].w)
{
dp[j].t=dp[j-p[i].w].t+p[i].w;
dp[j].sum=dp[j-p[i].w].sum+dp[j].t;
}
}
}
}
}
printf("%d %d %d\n",dp[m].val,dp[m].num,dp[m].sum);
}
return 0;
}

最新文章

  1. oracle impdp 导入
  2. 在.net中序列化读写xml方法
  3. A*(A星)算法python实现
  4. 负载均衡、LVS概述
  5. EL表达式读取数据(在Map,javaBean,List)
  6. 通过Java字节码发现有趣的内幕之String篇(上)(转)
  7. 大话设计模式C++实现-文章7章-代理模式
  8. doclint in jdk8
  9. document.body.scrollTop 值总为0
  10. 《深入浅出Netty》【PDF】下载
  11. [POJ1273][USACO4.2]Drainage Ditches (网络流最大流)
  12. 超小Web手势库AlloyFinger原理(转载)
  13. linux学习第十四天 (Linux就该这么学)找到一本不错的Linux电子书
  14. Java 判断相等
  15. Linux用过的命令集合
  16. sklearn_线性回归
  17. 2、C++
  18. TMS Xdata Server
  19. 【转】【Linux】grep命令详解
  20. bzoj1269

热门文章

  1. ipython的使用
  2. JavaScript(三) - 精简
  3. 检测Python程序的执行效率
  4. ES6系列_4之扩展运算符和rest运算符
  5. python实现进度条--主要用在上传下载文件
  6. 删除.svn 文件
  7. sass对象的定义
  8. Win7删除远程连接历史记录
  9. Java核心技术-泛型程序设计
  10. 读写大“二进制”文件,不必申请很大内存(fopen,fread,fwrite,fclose)