洛谷P1411 砝码称重
传送门啦
这个题总体思路就是先搜索在 $ dp $
void dfs(int keep,int now){
//使用 放弃
if(now > m) return;
//已经放弃超过m个了,就退出
if(keep == n){
if(now == m) dp();
return ;
}
///如果搜索完后正好符合条件,执行一次dp过程
dfs(keep + 1 , now);
//这个砝码选
vis[keep] = true;//打标记
dfs(keep + 1 , now + 1);
//这个砝码放弃
vis[keep] = false;//取消标记
}
观察题目可得,这个过程可以通过01背包实现。
定义 $ f[i][j] $ 为当前选取到了第j个砝码,如果通过之前的砝码可以称量出重量 $ i $ 那么 $ f[i][j] $ 的值为 $ true $ 。
状态转移方程为: $ f[i][j]=f[i-a[i]][j-1] $
初始状态为 $ f[0][j]=true $
最后 $ f[i][n] $ 中 $ true $ 的个数就是通过这些砝码可以计算出的重量值。通过一维数组,我们可以只定义一个 $ f[i] $ 数组,降低了时间复杂度,注意此时内层循环倒序。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
inline int read(){
char ch = getchar();
int f = 1 , x = 0;
while(ch > '9' || ch < '0'){if(ch == '-')f = -1;ch = getchar();}
while(ch >= '0' && ch <= '9'){x = (x << 1) + (x << 3) + ch - '0';ch = getchar();}
return x * f;
}
int n,m,a[300];
bool vis[300];
int ans,f[3000],tot,res;
void dp(){
memset(f , 0 , sizeof(f));
f[0] = true; ans = tot = 0;
for(int i=0;i<n;i++){
if(vis[i]) continue;
for(int j=tot;j>=0;j--)
if(f[j] && !f[j+a[i]]){
f[j+a[i]] = true;
ans++;
}
tot += a[i];
}
res = max(ans , res);
}
void dfs(int keep,int now){
//使用 放弃
if(now > m) return;
if(keep == n){
if(now == m) dp();
return ;
}
dfs(keep + 1 , now);
vis[keep] = true;
dfs(keep + 1 , now + 1);
vis[keep] = false;
}
int main(){
n = read(); m = read();
for(int i=0;i<n;i++) {
a[i] = read();
}
dfs(0 , 0);
printf("%d\n",res);
return 0;
}
洛谷P1411 砝码称重的更多相关文章
- 洛谷P1441 砝码称重(搜索,dfs+bitset优化)
洛谷P1441 砝码称重 \(n\) 的范围为 \(n \le 20\) ,\(m\) 的范围为 \(m \le 4\) . 暴力遍历每一种砝码去除情况,共有 \(n^m\) 种情况. 对于剩余砝码求 ...
- 洛谷P1441 砝码称重(搜索,dfs+dp)
洛谷P1441 砝码称重 \(n\) 的范围为 \(n \le 20\) ,\(m\) 的范围为 \(m \le 4\) . 暴力遍历每一种砝码去除情况,共有 \(n^m\) 种情况. 对于剩余砝码求 ...
- 洛谷P1441 砝码称重
P1441 砝码称重 题目描述 现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0). 输入输出格式 输入格式: 输入文件weight.in ...
- 洛谷 P2347 砝码称重
P2347 砝码称重 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1 ...
- 洛谷P2347 砝码称重 [2017年4月计划 动态规划01]
P2347 砝码称重 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1 ...
- 洛谷P2347 砝码称重 【多重背包】(方案数)(经典)
题目链接:https://www.luogu.org/problemnew/show/P2347 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入 ...
- 洛谷 P2347 砝码称重 != codevs 2144
题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1g砝码有a1个,2g砝 ...
- 洛谷——P2347 砝码称重
https://www.luogu.org/problem/show?pid=2347#sub 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输 ...
- 洛谷 P1441 砝码称重
题目描述 现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0). 输入输出格式 输入格式: 输入文件weight.in的第1行为有两个整数n ...
随机推荐
- 编译安装nrpe,配置监控mysql端口和主从状态
1.安装插件 # tar xvf nagios-plugins-1.4.13.tar.gz # cd nagios-plugins-1.4.13 # ./configure # make && ...
- 团体程序设计天梯赛 L1-010. 比较大小
测试数据: 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 Code: 先确定最小,然后确定第二小 #include <stdio.h> #include < ...
- R语言 神经网络算法
人工神经网络(ANN),简称神经网络,是一种模仿生物神经网络的结构和功能的数学模型或计算模型.神经网络由大量的人工神经元联结进行计算.大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自 ...
- Java入门:练习——自定义通用工具类
请编写一个通用工具类,该类具有如下功能: 1)判断一个字符串是否是邮箱地址 2)判断一个字符串是否是手机号码 3)判断一个字符串是否是电话号码 4)判断一个字符串是否是IP地址 代码结构如下,请补充完 ...
- NCPC2016-E- Exponial
题目描述 Illustration of exponial(3) (not to scale), Picture by C.M. de Talleyrand-Périgord via Wikimedi ...
- 已经菜到不行了 PAT 1010. Radix (25)
https://www.patest.cn/contests/pat-a-practise/1010 题目大意: 输入四个数字,a,b,c,d. a和b是两个数字,c=1表示是第一个数字,c=2表示是 ...
- 15 Most Read Data Science Articles in 2015. So far …
15 Most Read Data Science Articles in 2015. So far … We've compiled the latest set of "most rea ...
- Centos7一键编译安装zabbix-4.0.2
##只针对centos7的系统有效,centos6无效,mysql zabbix用户:zabbix,密码:zabbix;建议用全新的centos7服务器 软件版本: (nginx-1.14.2.php ...
- CSS3实战之box-shadow篇
box-shadow属性包含6个参数值:阴影类型.X轴位移.Y轴位移.阴影大小.阴影扩展和阴影颜色.这6个参数值可以有选择地省略. 现在我们用一个img元素来举栗子 我们先来写最简单的box-shad ...
- Sublime遇见中文乱码问题?
今天在写demo的时候,突然发现html页面上的中文在浏览器上显示乱码~!!!!! 这时,我根据网上的提示安装了两个插件:converttoUtf-8,support Gbk ~~~然而,好像无济于事 ...