题目描述

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

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

输入输出格式

输入格式:

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

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

输出格式:

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

输入输出样例

输入样例#1: 复制

3 1
1 2 2
输出样例#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

#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的更多相关文章

  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. 前端-----margin用法(盒子模型里补充)

    margin塌陷问题 当时说到了盒模型,盒模型包含着margin,为什么要在这里说margin呢?因为元素和元素在垂直方向上margin里面有坑. 我们来看一个例子: html结构: <div ...

  2. Laravel 5.2控制器--RESTful 资源控制器

    laravel的资源控制器 一.创建资源控制器 在命令行上,创建一个新的资源控制器 php artisan make:controller TestController --resource 然后在你 ...

  3. [maven] dependency标签理解

    在maven pom.xml文件中最多的就是dependency标签,我们用maven管理我们项目的依赖.这篇文章简单介绍dependency标签内部各个子标签的意义. 下面是dependency标签 ...

  4. Swift 学习- 02 -- 基础部分2

    class NamedShape{ var numberOfSides: Int = 0 var name: String init(name: String) { self.name = name ...

  5. selenium之 chromedriver与chrome版本映射表(更新至v2.33)

    看到网上基本没有最新的chromedriver与chrome的对应关系表,便兴起整理了一份如下,希望对大家有用: chromedriver版本 支持的Chrome版本 v2.33 v60-62 v2. ...

  6. HTML&javaSkcript&CSS&jQuery&ajax(二)

    一.HTML 1.标签<a href="http:www.baidu.com">This is a link </a>         <img sr ...

  7. tmk射气球

    问题 : tmk射气球 时间限制: 1 Sec  内存限制: 128 MB 题目描述 有一天TMK在做一个飞艇环游世界,突然他发现有一个气球沿匀速沿直线飘过,tmk想起了他飞艇上有一把弓,他打算拿弓去 ...

  8. java获取当前时间精确到毫秒

    转载:http://af8991.iteye.com/blog/1217672 import java.text.SimpleDateFormat; import java.util.Date; im ...

  9. LoadRunner JAVA Vuser接口测试

    注:JDK只支持1.6 1.创建工程Test2.写个经典的HelloWorld类.3.Runas--->Java Application运行下4.将工程下的整个com包拷贝到loadrunner ...

  10. oracle 12c ORA-01017:invalid username/password; logon denied

    Oracle 12C 中,想通过操作系统认证登录Oracle 数据库,有一些要注意的地方.不然就会遇到 ORA-01017:invalid username/password; logon denie ...