题目来源:UVA 624

题目的意思就是:我现在需要从 t 张CD中拿出一部分来,尽可能的凑出接近 N 这么久的音乐,但是不能超过 N。

CD不超过20张,每张长度不超过 N ,不能重复选。

一个很简单的0-1背包。因为最多只有220 = 1048576种可能,所以即使是枚举所有情况都可以毫无压力的搞起。

我这里用的DFS进行枚举,然后得到最好的结果。

最后需要说的是,此题是特判的。输出CD的长度的时候是无序的。

附AC代码:

   1: #include <stdio.h>

   2: #include <iostream>

   3: #include <math.h>

   4: #include <stdlib.h>

   5: #include <string.h>

   6: #include <algorithm>

   7: #include <string>

   8: #include <vector>

   9: using namespace std;

  10:  

  11: int t, n, pri[29], res[29], tmp[29], sum = 0;

  12:     

  13: void dfs(int id)

  14: {

  15:     if (id > n)

  16:     {

  17:         int m = 0;

  18:         for (int i = 1; i <= n; i++)

  19:             if (tmp[i])

  20:                 m += pri[i];

  21:         if (m > sum && m <= t)

  22:         {

  23:             sum = m;

  24:             for (int i = 1; i <= n; i++)

  25:                 res[i] = tmp[i];

  26:         }

  27:         return;

  28:     }

  29:     else

  30:     {

  31:         tmp[id] = 1;

  32:         dp(id+1);

  33:         tmp[id] = 0;

  34:         dp(id+1);

  35:         return;

  36:     }

  37: }

  38:  

  39: int main()

  40: {

  41:     while (~scanf("%d%d", &t, &n))

  42:     {

  43:         memset(res, 0, sizeof(res));

  44:         memset(tmp, 0, sizeof(tmp));

  45:         memset(pri, 0, sizeof(pri));

  46:         sum = 0;

  47:         for (int i = 1; i <= n; i++)

  48:             scanf("%d", &pri[i]);

  49:         dfs(1);

  50:         for (int i = 1; i <= n; i++)

  51:             if (res[i])

  52:                 printf("%d ", pri[i]);

  53:         printf("sum:%d\n", sum);

  54:     }

  55: }

大家一起做训练 第一场 G CD的更多相关文章

  1. 大家一起做训练 第一场 B Tournament

    题目来源:CodeForce #27 B 有n个人比赛,两两之间都有一场比赛,一共 n * (n - 1) / 2 场比赛.每场比赛的记录方式是 a b,表示在a和b的比赛中,a胜出,b失败. 经过研 ...

  2. 大家一起做训练 第一场 E Number With The Given Amount Of Divisors

    题目来源:CodeForce #27 E 题目意思和题目标题一样,给一个n,求约数的个数恰好为n个的最小的数.保证答案在1018内. Orz,这题训练的时候没写出来. 这道题目分析一下,1018的不大 ...

  3. 大家一起做训练 第一场 A Next Test

    题目来源:CodeForce #27 A 题目的意思简而言之就是要你输出一个没有出现过的最小的正整数. 题意如此简单明了,做法也很明了. 直接读入所有的数,然后排个序,设置个变量从1开始,出现过+1, ...

  4. [HDU6304][数学] Chiaki Sequence Revisited-杭电多校2018第一场G

    [HDU6304][数学] Chiaki Sequence Revisited -杭电多校2018第一场G 题目描述 现在抛给你一个数列\(A\) \[ a_n=\begin{cases}1 & ...

  5. 2015多校联合训练第一场Tricks Device(hdu5294)

    题意:给一个无向图,给起点s,终点t,求最少拆掉几条边使得s到不了t,最多拆几条边使得s能到t 思路: 先跑一边最短路,记录最短路中最短的边数.总边数-最短边数就是第二个答案 第一个答案就是在最短路里 ...

  6. HDU多校训练第一场 1012 Sequence

    题目链接:acm.hdu.edu.cn/showproblem.php?pid=6589 题意:给出一个长度为n的数组,有m次操作,操作有3种1,2,3,问操作m次后的数组,输出i*a[i]的异或和 ...

  7. 大家一起做训练 第二场 E Cottage Village

    题目来源:CodeForce #15 A 现在有 n 间正方形的房子,其中心点分布在 X轴 上,现在我需要新建一间边长为 t 的房子,要求新房子至少和一间房子相邻,但是不能和其他房子重合.请输出我有多 ...

  8. 牛客网多校训练第一场 I - Substring(后缀数组 + 重复处理)

    链接: https://www.nowcoder.com/acm/contest/139/I 题意: 给出一个n(1≤n≤5e4)个字符的字符串s(si ∈ {a,b,c}),求最多可以从n*(n+1 ...

  9. 牛客网多校训练第一场 F - Sum of Maximum(容斥原理 + 拉格朗日插值法)

    链接: https://www.nowcoder.com/acm/contest/139/F 题意: 分析: 转载自:http://tokitsukaze.live/2018/07/19/2018ni ...

随机推荐

  1. ubuntu 常用设置

    ●1 问题:使用virt-manager创建虚拟机时,Virtual network 'default':NAT(Inactive) 解决方法:1,查看网络状态sudo virsh net-list ...

  2. 算法笔记--区间dp

    1.石子归并问题 dp[i][j]表示区间i到j合并所需的最小花费. 先求出小区间的最小花费,再转移到大的区间. 转移方程:dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1] ...

  3. Oracle数据库system用户忘记了密码怎么办

    1.在运行里面输入cmd调出dos窗口,然后在dos窗口中输入sqlplus /nolog 如:D:\oracle\ora92\bin>sqlplus /nolog 2.输入连接命令 如:SQL ...

  4. python-GUI,生成ssn

    第一次做这个, 样子有点丑,主要是实现功能,做测试的时候,经常要用到身份证号.手机号.姓名等,这里先生成ssn,后续研究怎么做成客户端 代码: from tkinter import * from u ...

  5. BUCTOJ1073

    #include "iostream" #include "algorithm" using namespace std; ; struct Time { in ...

  6. RedHat Linux 5下不能使用fdisk的问题

    最近在用RedHat Linux5的时候,使用fdisk命令,遇到了下面的错误: bash:fdisk:command not found 在网上找了找,解决方案如下: 首先,这个错误的原因是因为fd ...

  7. Apache Tomcat 6.0 Tomcat6 服务因 1 (0x1) 服务特定错误而停止

    1.Tomcat目录下的bin

  8. 关于PermGen space内存溢出错误解决方法

    1.参考: http://blog.csdn.net/fox009/article/details/5633007 http://hi.baidu.com/like_dark/blog/item/19 ...

  9. Sql Server中集合的操作(并集、差集、交集)学习

    首先我们做一下测试数据 1.创建测试数据 --创建人员表1-- create table Person1 ( Uid ,) primary key, Name ) not null ) --创建人员表 ...

  10. ECC算法整理纪要

    初始ECC算法 1.用户A 密钥生成 (1):用随机数发生器产生随机数k∈[1,n-1]: (2):计算椭圆曲线点PA=[k]G,为公钥,k为用户A私钥: 2. 用户B加密算法及流程 设需要发送的消息 ...