P1441 砝码称重 DFS回溯+DP
题目描述
现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0)。
请注意,砝码只能放在其中一边。
输入输出格式
输入格式:
输入文件weight.in的第1行为有两个整数n和m,用空格分隔
第2行有n个正整数a1,a2,a3,……,an,表示每个砝码的重量。
输出格式:
输出文件weight.out仅包括1个整数,为最多能称量出的重量数量。
输入输出样例
说明
【样例说明】
在去掉一个重量为2的砝码后,能称量出1,2,3共3种重量。
【数据规模】
对于20%的数据,m=0;
对于50%的数据,m≤1;
对于50%的数据,n≤10;
对于100%的数据,n≤20,m≤4,m<n,ai≤100。
一开始总想着骚操作 但是细节太多处理不了
直接暴力搜索就能过的。。。。
没任何优化 1600ms
- #include<bits/stdc++.h>
- using namespace std;
- //input b y bxd
- #define rep(i,a,b) for(int i=(a);i<=(b);i++)
- #define repp(i,a,b) for(int i=(a);i>=(b);--i)
- #define RI(n) scanf("%d",&(n))
- #define RII(n,m) scanf("%d%d",&n,&m)
- #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
- #define RS(s) scanf("%s",s);
- #define ll long long
- #define REP(i,N) for(int i=0;i<(N);i++)
- #define CLR(A,v) memset(A,v,sizeof A)
- #define inf 0x3f3f3f3f
- //////////////////////////////////
- #define N 20+9
- int n,m;
- int vis[N];
- int a[N];
- int q[N];
- int dp[];
- int cnt;
- int maxx;
- void dp1()
- {
- CLR(dp,);
- dp[]=;
- int cnt=;
- rep(i,,n)
- if(vis[i])
- {
- repp(j,,)
- if(dp[j]&&!dp[j+a[i]])dp[j+a[i]]=,cnt++;
- }
- maxx=max(maxx,cnt);
- }
- void dfs(int cur,int num)
- {
- if(num>n-m)return ;
- if(num==n-m)
- {
- dp1();
- return ;
- }
- rep(i,cur,n)
- if(!vis[i])
- {
- vis[i]=;
- dfs(i+,num+);
- vis[i]=;
- }
- return ;
- }
- int main()
- {
- RII(n,m);
- rep(i,,n)
- RI(a[i]);
- maxx=;
- dfs(,);
- cout<<maxx;
- return ;
- }
加一个dp上界的优化 950ms
- #include<bits/stdc++.h>
- using namespace std;
- //input b y bxd
- #define rep(i,a,b) for(int i=(a);i<=(b);i++)
- #define repp(i,a,b) for(int i=(a);i>=(b);--i)
- #define RI(n) scanf("%d",&(n))
- #define RII(n,m) scanf("%d%d",&n,&m)
- #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
- #define RS(s) scanf("%s",s);
- #define ll long long
- #define REP(i,N) for(int i=0;i<(N);i++)
- #define CLR(A,v) memset(A,v,sizeof A)
- #define inf 0x3f3f3f3f
- //////////////////////////////////
- #define N 20+9
- int n,m;
- int vis2[];
- int vis[N];
- int a[N];
- int q[N];
- int dp[];
- int cnt;
- int tot;
- int maxx;
- void dp1()
- {
- CLR(dp,);
- dp[]=;
- int cnt=;
- rep(i,,n)
- if(vis[i])
- {
- repp(j,tot,)
- if(dp[j]&&!dp[j+a[i]])dp[j+a[i]]=,cnt++;
- }
- maxx=max(maxx,cnt);
- }
- void dfs(int cur,int num)
- {
- if(num>n-m)return ;
- if(num==n-m)
- {
- dp1();
- return ;
- }
- rep(i,cur,n)
- if(!vis[i])
- {
- vis[i]=;
- dfs(i+,num+);
- vis[i]=;
- }
- return ;
- }
- int main()
- {
- RII(n,m);
- tot=;
- rep(i,,n)
- RI(a[i]),tot+=a[i];
- maxx=;
- dfs(,);
- cout<<maxx;
- return ;
- }
再次上界优化 400ms!!!!
- #include<bits/stdc++.h>
- using namespace std;
- //input b y bxd
- #define rep(i,a,b) for(int i=(a);i<=(b);i++)
- #define repp(i,a,b) for(int i=(a);i>=(b);--i)
- #define RI(n) scanf("%d",&(n))
- #define RII(n,m) scanf("%d%d",&n,&m)
- #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
- #define RS(s) scanf("%s",s);
- #define ll long long
- #define REP(i,N) for(int i=0;i<(N);i++)
- #define CLR(A,v) memset(A,v,sizeof A)
- #define inf 0x3f3f3f3f
- //////////////////////////////////
- #define N 20+9
- int n,m;
- int vis[N];
- int a[N];
- int dp[];
- int cnt;
- int maxx;
- void dp1()
- {
- CLR(dp,);
- dp[]=;
- int cnt=;
- int tot=;
- rep(i,,n)
- if(vis[i])
- {
- repp(j,tot,)
- if(dp[j]&&!dp[j+a[i]])dp[j+a[i]]=,cnt++;
- tot+=a[i];
- }
- maxx=max(maxx,cnt);
- }
- void dfs(int cur,int num)
- {
- if(num>n-m)return ;
- if(num==n-m)
- {
- dp1();
- return ;
- }
- rep(i,cur,n)
- if(!vis[i])
- {
- vis[i]=;
- dfs(i+,num+);
- vis[i]=;
- }
- return ;
- }
- int main()
- {
- RII(n,m);
- rep(i,,n)
- RI(a[i]);
- maxx=;
- dfs(,);
- cout<<maxx;
- return ;
- }
P1441 砝码称重 DFS回溯+DP的更多相关文章
- 洛谷P1441 砝码称重(搜索,dfs+dp)
洛谷P1441 砝码称重 \(n\) 的范围为 \(n \le 20\) ,\(m\) 的范围为 \(m \le 4\) . 暴力遍历每一种砝码去除情况,共有 \(n^m\) 种情况. 对于剩余砝码求 ...
- 洛谷P1441 砝码称重(搜索,dfs+bitset优化)
洛谷P1441 砝码称重 \(n\) 的范围为 \(n \le 20\) ,\(m\) 的范围为 \(m \le 4\) . 暴力遍历每一种砝码去除情况,共有 \(n^m\) 种情况. 对于剩余砝码求 ...
- 7行代码解决P1441砝码称重(附优化过程)
先贴上最终代码感受一下: #include <bits/stdc++.h> using namespace std; int i, N, M, wi[21], res = 0; int m ...
- 洛谷P1441 砝码称重
P1441 砝码称重 题目描述 现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0). 输入输出格式 输入格式: 输入文件weight.in ...
- P1441 砝码称重(搜索+队列dp)
题目链接:传送门 题目大意: 给你n个砝码ai,从中去掉m个后求最多的砝码可表示的重量. n≤20,m≤4,m<n,ai≤100. 思路: 用dfs搜掉m个砝码,然后用队列dp跑出答案,维护答案 ...
- [P1441]砝码称重 (搜索+DP)
对于我这种蒟蒻,是很不错的一题了. dfs搜索当前状态 满足时DP 比较坑的地方就是起始的地方 我一开始从1开始,搜索写的是从0开始. 后来就统一用0开始的了. #include<bits/st ...
- 洛谷 P1441 砝码称重
题目描述 现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0). 输入输出格式 输入格式: 输入文件weight.in的第1行为有两个整数n ...
- P1441 砝码称重
题目描述 现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0). 输入输出格式 输入格式: 输入文件weight.in的第1行为有两个整数n ...
- [Luogu] P1441 砝码称重
题目描述 现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0). 题目分析 因为读错题WAWA大哭. 先dfs枚举选的砝码,满足条件时进行d ...
随机推荐
- zxing源码编译与运行
编译的jar文件下载地址:http://files.cnblogs.com/rainboy2010/zxing.zip zxing是一个开源的解析条形码/二维码的类库,广泛应用于Android 各大A ...
- swift 实践- 07 -- UISwitch 开关
import UIKit class ViewController: UIViewController { var uiswitch: UISwitch? override func viewDidL ...
- 信息摘要算法之六:HKDF算法分析与实现
HKDF是一种特定的键衍生函数(KDF),即初始键控材料的功能,KDF从其中派生出一个或多个密码强大的密钥.在此我们想要描述的是基于HMAC的HKDF. 1.HKDF概述 密钥派生函数(KDF)是密码 ...
- Confluence 6 使用 Decorator 宏
Decorator 宏(Macros)是 Velocity 宏.这个宏可以被用来在页面编辑 Custom decorators 中创建复杂或者可变的部分,例如菜单,页面其他部分等.Decorator ...
- Redis的消息发布和订阅
Redis的消息发布和订阅 Author:SimpleWu GitHub-redis 什么是消息发布和订阅? Redis 发布订阅(pub/sub)是一种进程间的消息通信模式: 发送者(pub)发送消 ...
- ES6笔记
/** * Created by Administrator on 2017/4/13. */ /*---------------------Es6编码规范---------------------* ...
- LeetCode(81): 搜索旋转排序数组 II
Medium! 题目描述: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给 ...
- eclipse maven .jar中没有主清单属性
报错环境: windows系统eclipse maven 打包jar包后, 运行 java -jar 报错 E:\My_java\mysql\target>java -jar original- ...
- PyCharm新建.py文件时自动带出指定内容
如:给Pycharm加上头行 # coding:utf-8File—Setting—Editor--Code Style--File and Code Templates--Python Scrip ...
- Appium 九宫格 手势解锁
分析九宫格定位 整个九宫格是一个 view self.driver.find_element_by_id("com.elc:id/gesturepwd_create_lockview&q ...