Codevs 2144 砝码称重 2
有n个砝码,现在要称一个质量为m的物体,请问最少需要挑出几个砝码来称?
注意一个砝码最多只能挑一次
第一行两个整数n和m,接下来n行每行一个整数表示每个砝码的重量。
输出选择的砝码的总数k,你的程序必须使得k尽量的小。
3 10
5
9
1
2
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
Codevs 2144 砝码称重 2的更多相关文章
- codevs 2144 砝码称重2
传送门 2144 砝码称重 2 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 有n个砝码,现在要称一个质量为m ...
- Codevs No.2144 砝码称重2
2016-05-31 22:01:16 题目链接: 砝码称重2 (Codevs No.2144) 题目大意: 给定N个砝码,求称出M的重量所需砝码最小个数 解法: 贪心 使砝码数量最小,当然是每个砝码 ...
- NOI题库--砝码称重V2(多重背包2^n拆分)
以前只会写多重背包的原版,渣的不行,为了做此题不得不学习了一下,发现其实也不难,只要理解了方法就好多了(PS:其实和倍增挺像的) 8756:砝码称重V2 总时间限制: 1000ms 内存限制: 655 ...
- 安徽省2016“京胜杯”程序设计大赛_A_砝码称重
砝码称重 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 61 Accepted: 37 Description 小明非常喜 ...
- P2347 砝码称重-DP方案数-bitset
P2347 砝码称重 DP做法 : 转化为 01背包. 进行方案数 更新.最后统计种类. #include<bits/stdc++.h> using namespace std; #def ...
- 51nod 1449 砝码称重 (进制思想)
1449 砝码称重 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 现在有好多种砝码,他们的重量是 w0,w1,w ...
- 51nod 1837 砝码称重【数学,规律】
题目链接:51nod 1837 砝码称重 小 Q 有 n 个砝码,它们的质量分别为 1 克. 2 克.……. n 克. 他给 i 克的砝码标上了编号 i (i = 1, 2, ..., n),但是编号 ...
- P2347 砝码称重
P2347 砝码称重 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1 ...
- 洛谷P1441 砝码称重
P1441 砝码称重 题目描述 现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0). 输入输出格式 输入格式: 输入文件weight.in ...
随机推荐
- 分享知识-快乐自己:Shrio 权限标签
一.验证当前用户是否为"访客",即未认证(包含未记住)的用户 <shiro:guest> Hi there! Please <a href="login ...
- 分享知识-快乐自己:springboot之thymeleaf (1):简单的thymeleaf例子
之前搞springboot时,发现spring很推荐thymeleaf,所以看了看学了学,感觉不错,做个笔记先. 做个简单和例子,项目是springboot,所以引入themeleaf相关包 pom. ...
- 理解WCF(第二部分,部分參考他人)
該篇的主題:wcf到底是怎工作的? 一.什么是分布式: 首先看一张图: 由上图对比我们可以发现,区别就是前者把服务器放在了一台电脑上,而后者把服务器放在了多台电脑上.这样多台电脑处理起来的速度比一台电 ...
- poj-2478 Farey Sequence(dp,欧拉函数)
题目链接: Farey Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14230 Accepted: ...
- leetcode 6 ZigZag Conversion(水题)
就是简单的模拟一下就可以了.但是我一开始是用一个二维char数组来存的,这样在最终扫全体时会扫很多空的位置,浪费了很多时间,所以就time limit error了. 所以改进一下就用string数组 ...
- Convolutional Neural Networks for Visual Recognition 3
Gradient Computing 前面我们介绍过分类器模型一般包含两大部分,一部分是score function,将输入的原始数据映射到每一类的score,另外一个重要组成部分是loss func ...
- 非系统数据文件损坏,rman备份恢复
实验前提:已经做好备份. SQL> col file_name for a50select file_id,file_name from dba_data_files; FILE_ID FILE ...
- CSS之EM相对单位
之前以为em单位只是在font-size中起到继承作用, 后来慢慢觉得,继承,应该是在几乎所有样式中都可以是实现的,比如height,width,border... 今天才简单测试了下,果真是可以实现 ...
- 添加一个用户并且让用户获得root权限
1.创建一般用户: 完全参考默认值创建一个用户, 一般账号UID应该是500以后的. 默认会创建用户家目录和账号一模一样的群组名.创建使用账号且给予口令才算完成了用户的创建流程. useradd us ...
- debian服务查询
1.查询 用root身份执行service --status-all查看所有服务的状态 "+" started "-" stopped "?" ...