2144 砝码称重 2

 时间限制: 1 s
 空间限制: 16000 KB
 题目等级 : 钻石 Diamond
 
 
 
题目描述 Description

有n个砝码,现在要称一个质量为m的物体,请问最少需要挑出几个砝码来称?

注意一个砝码最多只能挑一次

输入描述 Input Description

第一行两个整数n和m,接下来n行每行一个整数表示每个砝码的重量。

输出描述 Output Description

输出选择的砝码的总数k,你的程序必须使得k尽量的小。

样例输入 Sample Input

3 10
5
9
1

样例输出 Sample Output

2

数据范围及提示 Data Size & Hint

1<=n<=30,1<=m<=2^31,1<=每个砝码的质量<=2^30

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 31
int n,ans=0x7fffffff;
long long a[maxn],s[maxn],m;
bool cmp(int x,int y){return x>y;}
long long qread(){
long long i=;
char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch<=''&&ch>=''){i=i*+ch-'';ch=getchar();}
return i;
}
void dfs(int pos,int cnt,long long sum){
if(sum==m){ans=min(ans,cnt);return;}
if(cnt>=ans)return;
if(pos>n)return;
for(int i=pos;i<=n;i++){
if(s[i]<m-sum)return;
if(a[i]>m-sum)continue;
dfs(i+,cnt+,sum+a[i]);
}
}
int main(){
freopen("Cola.txt","r",stdin);
scanf("%d",&n);
m=qread();
for(int i=;i<=n;i++)a[i]=qread();
sort(a+,a+n+,cmp);
for(int i=n;i>=;i--)s[i]=s[i+]+a[i];
dfs(,,);
printf("%d",ans);
}

100分 后缀和+剪枝

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
int ans(),w[],n;
long long mm;
map<int, int>m;
void dfs(int js,int last,int sum,bool k)
{
int r=n;
if(k){m[sum]=js;r/=;}
else
{
if(m.find(mm - sum)!=m.end())
ans=min(ans,js+m[mm-sum]);
}
for(int i=last;i<r;i++)
dfs(js+,i+,sum+w[i],k);
}
int main()
{
scanf("%d%lld",&n,&mm);
for(int i=;i<n;i++)
scanf("%d",&w[i]);
dfs(,,,true);
dfs(,n/,,false);
printf("%d\n",ans);
return ;
}

100分 meet in the middle

最新文章

  1. webstorm 10 出现不能run cordova项目
  2. C#--静态成员的生命周期
  3. 基于DDD的.NET开发框架 - ABP模块设计
  4. 用C++实现的SDK跨平台心得体会
  5. 清除dns缓存
  6. 【系统移植】Android系统移植
  7. NP
  8. BI系统规划前需要准备的6项工作
  9. ASP.NET制作一个简单的等待窗口
  10. ##DAY13——可视化编程之XIB
  11. CSS禁止用户选择复制
  12. Struts2运行流程-源码剖析
  13. Basic Data Structure
  14. es6重点笔记:Symbol,Set,Map,Proxy,Reflect
  15. js实现点击按钮复制文本功能
  16. 如何解决make时报错crti. o: unrecognized relocation (0x2a) in section `.init
  17. [luogu P2319] [HNOI2006]超级英雄
  18. SSH加密原理、RSA非对称加密算法学习与理解
  19. CCSprite: fade 效果切换图片
  20. Linux下profile与bashrc的区别

热门文章

  1. POJ 1504,ZOJ 2001,UVA 713, Adding Reversed Numbers,错误,已找到错误
  2. kaggle 欺诈信用卡预测——不平衡训练样本的处理方法 综合结论就是:随机森林+过采样(直接复制或者smote后,黑白比例1:3 or 1:1)效果比较好!记得在smote前一定要先做标准化!!!其实随机森林对特征是否标准化无感,但是svm和LR就非常非常关键了
  3. vue2.0项目实战使用axios发送请求
  4. Mysql总结_02_mysql数据库忘记密码时如何修改
  5. Java之 将程序打包成jar包
  6. 201621123014《JAVA程序设计》第2周学习总结
  7. hdu4699 Editor(双向链表或双栈对弹)
  8. 文件系统(node.js学习笔记)
  9. ACM学习历程—HDU 5446 Unknown Treasure(数论)(2015长春网赛1010题)
  10. params 和 query 传参的区别