题目描述

现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0)。

请注意,砝码只能放在其中一边。

输入输出格式

输入格式:

输入文件weight.in的第1行为有两个整数n和m,用空格分隔

第2行有n个正整数a1,a2,a3,……,an,表示每个砝码的重量。

输出格式:

输出文件weight.out仅包括1个整数,为最多能称量出的重量数量。

输入输出样例

输入样例#1: 复制

  1. 3 1
  2. 1 2 2
输出样例#1: 复制

  1. 3

说明

【样例说明】

在去掉一个重量为2的砝码后,能称量出1,2,3共3种重量。

【数据规模】

对于20%的数据,m=0;

对于50%的数据,m≤1;

对于50%的数据,n≤10;

对于100%的数据,n≤20,m≤4,m<n,ai≤100。

一开始总想着骚操作  但是细节太多处理不了

直接暴力搜索就能过的。。。。

没任何优化  1600ms

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. //input b y bxd
  4. #define rep(i,a,b) for(int i=(a);i<=(b);i++)
  5. #define repp(i,a,b) for(int i=(a);i>=(b);--i)
  6. #define RI(n) scanf("%d",&(n))
  7. #define RII(n,m) scanf("%d%d",&n,&m)
  8. #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
  9. #define RS(s) scanf("%s",s);
  10. #define ll long long
  11. #define REP(i,N) for(int i=0;i<(N);i++)
  12. #define CLR(A,v) memset(A,v,sizeof A)
  13. #define inf 0x3f3f3f3f
  14. //////////////////////////////////
  15. #define N 20+9
  16.  
  17. int n,m;
  18. int vis[N];
  19. int a[N];
  20. int q[N];
  21. int dp[];
  22. int cnt;
  23. int maxx;
  24.  
  25. void dp1()
  26. {
  27. CLR(dp,);
  28. dp[]=;
  29. int cnt=;
  30. rep(i,,n)
  31. if(vis[i])
  32. {
  33. repp(j,,)
  34. if(dp[j]&&!dp[j+a[i]])dp[j+a[i]]=,cnt++;
  35. }
  36. maxx=max(maxx,cnt);
  37. }
  38.  
  39. void dfs(int cur,int num)
  40. {
  41. if(num>n-m)return ;
  42. if(num==n-m)
  43. {
  44. dp1();
  45. return ;
  46. }
  47. rep(i,cur,n)
  48. if(!vis[i])
  49. {
  50. vis[i]=;
  51. dfs(i+,num+);
  52. vis[i]=;
  53. }
  54. return ;
  55. }
  56.  
  57. int main()
  58. {
  59. RII(n,m);
  60. rep(i,,n)
  61. RI(a[i]);
  62.  
  63. maxx=;
  64. dfs(,);
  65. cout<<maxx;
  66. return ;
  67. }

加一个dp上界的优化   950ms

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. //input b y bxd
  4. #define rep(i,a,b) for(int i=(a);i<=(b);i++)
  5. #define repp(i,a,b) for(int i=(a);i>=(b);--i)
  6. #define RI(n) scanf("%d",&(n))
  7. #define RII(n,m) scanf("%d%d",&n,&m)
  8. #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
  9. #define RS(s) scanf("%s",s);
  10. #define ll long long
  11. #define REP(i,N) for(int i=0;i<(N);i++)
  12. #define CLR(A,v) memset(A,v,sizeof A)
  13. #define inf 0x3f3f3f3f
  14. //////////////////////////////////
  15. #define N 20+9
  16.  
  17. int n,m;
  18. int vis2[];
  19. int vis[N];
  20. int a[N];
  21. int q[N];
  22. int dp[];
  23. int cnt;
  24. int tot;
  25. int maxx;
  26.  
  27. void dp1()
  28. {
  29. CLR(dp,);
  30. dp[]=;
  31. int cnt=;
  32. rep(i,,n)
  33. if(vis[i])
  34. {
  35. repp(j,tot,)
  36. if(dp[j]&&!dp[j+a[i]])dp[j+a[i]]=,cnt++;
  37. }
  38. maxx=max(maxx,cnt);
  39. }
  40.  
  41. void dfs(int cur,int num)
  42. {
  43. if(num>n-m)return ;
  44. if(num==n-m)
  45. {
  46. dp1();
  47. return ;
  48. }
  49. rep(i,cur,n)
  50. if(!vis[i])
  51. {
  52. vis[i]=;
  53. dfs(i+,num+);
  54. vis[i]=;
  55. }
  56. return ;
  57. }
  58.  
  59. int main()
  60. {
  61. RII(n,m);
  62. tot=;
  63. rep(i,,n)
  64. RI(a[i]),tot+=a[i];
  65.  
  66. maxx=;
  67. dfs(,);
  68. cout<<maxx;
  69. return ;
  70. }

再次上界优化  400ms!!!!

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. //input b y bxd
  4. #define rep(i,a,b) for(int i=(a);i<=(b);i++)
  5. #define repp(i,a,b) for(int i=(a);i>=(b);--i)
  6. #define RI(n) scanf("%d",&(n))
  7. #define RII(n,m) scanf("%d%d",&n,&m)
  8. #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
  9. #define RS(s) scanf("%s",s);
  10. #define ll long long
  11. #define REP(i,N) for(int i=0;i<(N);i++)
  12. #define CLR(A,v) memset(A,v,sizeof A)
  13. #define inf 0x3f3f3f3f
  14. //////////////////////////////////
  15. #define N 20+9
  16. int n,m;
  17. int vis[N];
  18. int a[N];
  19. int dp[];
  20. int cnt;
  21. int maxx;
  22.  
  23. void dp1()
  24. {
  25. CLR(dp,);
  26. dp[]=;
  27. int cnt=;
  28. int tot=;
  29. rep(i,,n)
  30. if(vis[i])
  31. {
  32. repp(j,tot,)
  33. if(dp[j]&&!dp[j+a[i]])dp[j+a[i]]=,cnt++;
  34. tot+=a[i];
  35. }
  36. maxx=max(maxx,cnt);
  37. }
  38.  
  39. void dfs(int cur,int num)
  40. {
  41. if(num>n-m)return ;
  42. if(num==n-m)
  43. {
  44. dp1();
  45. return ;
  46. }
  47. rep(i,cur,n)
  48. if(!vis[i])
  49. {
  50. vis[i]=;
  51. dfs(i+,num+);
  52. vis[i]=;
  53. }
  54. return ;
  55. }
  56.  
  57. int main()
  58. {
  59. RII(n,m);
  60. rep(i,,n)
  61. RI(a[i]);
  62.  
  63. maxx=;
  64. dfs(,);
  65. cout<<maxx;
  66. return ;
  67. }

  

P1441 砝码称重 DFS回溯+DP的更多相关文章

  1. 洛谷P1441 砝码称重(搜索,dfs+dp)

    洛谷P1441 砝码称重 \(n\) 的范围为 \(n \le 20\) ,\(m\) 的范围为 \(m \le 4\) . 暴力遍历每一种砝码去除情况,共有 \(n^m\) 种情况. 对于剩余砝码求 ...

  2. 洛谷P1441 砝码称重(搜索,dfs+bitset优化)

    洛谷P1441 砝码称重 \(n\) 的范围为 \(n \le 20\) ,\(m\) 的范围为 \(m \le 4\) . 暴力遍历每一种砝码去除情况,共有 \(n^m\) 种情况. 对于剩余砝码求 ...

  3. 7行代码解决P1441砝码称重(附优化过程)

    先贴上最终代码感受一下: #include <bits/stdc++.h> using namespace std; int i, N, M, wi[21], res = 0; int m ...

  4. 洛谷P1441 砝码称重

    P1441 砝码称重 题目描述 现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0). 输入输出格式 输入格式: 输入文件weight.in ...

  5. P1441 砝码称重(搜索+队列dp)

    题目链接:传送门 题目大意: 给你n个砝码ai,从中去掉m个后求最多的砝码可表示的重量. n≤20,m≤4,m<n,ai≤100. 思路: 用dfs搜掉m个砝码,然后用队列dp跑出答案,维护答案 ...

  6. [P1441]砝码称重 (搜索+DP)

    对于我这种蒟蒻,是很不错的一题了. dfs搜索当前状态 满足时DP 比较坑的地方就是起始的地方 我一开始从1开始,搜索写的是从0开始. 后来就统一用0开始的了. #include<bits/st ...

  7. 洛谷 P1441 砝码称重

    题目描述 现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0). 输入输出格式 输入格式: 输入文件weight.in的第1行为有两个整数n ...

  8. P1441 砝码称重

    题目描述 现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0). 输入输出格式 输入格式: 输入文件weight.in的第1行为有两个整数n ...

  9. [Luogu] P1441 砝码称重

    题目描述 现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0). 题目分析 因为读错题WAWA大哭. 先dfs枚举选的砝码,满足条件时进行d ...

随机推荐

  1. zxing源码编译与运行

    编译的jar文件下载地址:http://files.cnblogs.com/rainboy2010/zxing.zip zxing是一个开源的解析条形码/二维码的类库,广泛应用于Android 各大A ...

  2. swift 实践- 07 -- UISwitch 开关

    import UIKit class ViewController: UIViewController { var uiswitch: UISwitch? override func viewDidL ...

  3. 信息摘要算法之六:HKDF算法分析与实现

    HKDF是一种特定的键衍生函数(KDF),即初始键控材料的功能,KDF从其中派生出一个或多个密码强大的密钥.在此我们想要描述的是基于HMAC的HKDF. 1.HKDF概述 密钥派生函数(KDF)是密码 ...

  4. Confluence 6 使用 Decorator 宏

    Decorator 宏(Macros)是 Velocity  宏.这个宏可以被用来在页面编辑 Custom decorators 中创建复杂或者可变的部分,例如菜单,页面其他部分等.Decorator ...

  5. Redis的消息发布和订阅

    Redis的消息发布和订阅 Author:SimpleWu GitHub-redis 什么是消息发布和订阅? Redis 发布订阅(pub/sub)是一种进程间的消息通信模式: 发送者(pub)发送消 ...

  6. ES6笔记

    /** * Created by Administrator on 2017/4/13. */ /*---------------------Es6编码规范---------------------* ...

  7. LeetCode(81): 搜索旋转排序数组 II

    Medium! 题目描述: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给 ...

  8. eclipse maven .jar中没有主清单属性

    报错环境: windows系统eclipse maven 打包jar包后, 运行 java -jar 报错 E:\My_java\mysql\target>java -jar original- ...

  9. PyCharm新建.py文件时自动带出指定内容

    如:给Pycharm加上头行  # coding:utf-8File—Setting—Editor--Code Style--File and Code Templates--Python Scrip ...

  10. Appium 九宫格 手势解锁

    分析九宫格定位 整个九宫格是一个 view   self.driver.find_element_by_id("com.elc:id/gesturepwd_create_lockview&q ...