首页 > 其他分享 >POJ1416 (dfs)

POJ1416 (dfs)

时间:2024-01-25 22:22:07浏览次数:25  
标签:927438 int POJ1416 50 dfs 34 include

POJ1416 (dfs)

公司现在要发明一种新的碎纸机,要求新的碎纸机能够把纸条上的数字切成最接近而不超过target值(可以选择不切割)。比如,target的值是50,而纸条上的数字是12346,应该把数字切成四部分,分别是1、2、34、6。因为这样所得到的和43 (= 1 + 2 + 34 + 6) 是所有可能中最接近而不超过50的。(比如1, 23, 4, 和6 就不可以,因为它们的和不如43接近50,而12, 34, 6也不可以,因为它们的和超过50了。要求(如果全部超过目标数字,输出error,如果有两种及以上和一样的最小答案,输出rejected)

示例输入

50 12346
376 144139
927438 927438
18 3312
9 3142
25 1299
111 33333
103 862150
6 1104
0 0

示例输出

43 1 2 34 6
283 144 139
927438 927438
18 3 3 12
error
21 1 2 9 9
rejected
103 86 2 15 0
rejected

思路:切割数字的过程就是一个简单的排列组合隔板法问题,使用dfs找到各个组合,验证各个组合的和即可,判断方法是,满足条件且不与已有最小答案相等为1,满足条件但;与最小答案相等为2;没有满足条件的为0;

answer:

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int pap[6];
int t, n, p;
bool flag[6];
bool cpy[6];
int ans,record;
void check(){
	int sum = 0, temp = 0;
	for(int i = 0;i <= p;i++){
		if(flag[i] || i == p){
			sum += temp;
			temp = 0;	
		}
		temp = temp * 10 + pap[i];
	}
	if(sum > ans && sum <= t) {
		record = 1;
		ans = sum;
		memcpy(cpy,flag,sizeof(flag));
	}
	else if(sum == ans) record = 2;
}
void dfs(int deep,int pre){
	if(deep == n) {
		check();
		return;
	}
	for(int i = pre + 1;i < p;i++){
		if(!flag[i]) {
			flag[i] = true;
			dfs(deep + 1, i);
			flag[i] = false;
		}
	}
}
int main() {
	char ch;
	while(1){
		scanf("%d", &t);
		if(t == 0) break;
		p = 0;
		ans = -1;
		record = 0;
		while((ch = getchar()) != '\n') {
			if(ch >= '0' && ch <= '9') {
				pap[p] = ch - '0';
				p++;
			}
		}
		memset(flag, false, sizeof(flag));
		for(n = 0;n < p;n++){
			dfs(0,0);
		}
		if(record == 0) printf("error\n");
		else if(record == 2) printf("rejected\n");
		else {
			printf("%d", ans);
			int temp = 0;
			for(int i = 0;i <= p;i++){
				if(cpy[i] || i == p){
					printf(" %d",temp);
					temp = 0;	
				}
				temp = temp * 10 + pap[i];
			}
			printf("\n");
		}
	}
	return 0;
} 

标签:927438,int,POJ1416,50,dfs,34,include
From: https://www.cnblogs.com/zhclovemyh/p/17988327

相关文章

  • POJ 2531(DFS)
    POJ2531题目大意,一共N个网络节点,每个节点与其他节点通信需要消耗流量,把这n个节点分为AB两个集合,使得A集合与B集合之间的通讯流量的总和最大。输入,N+N行N个的数据,输出最大的流量(N<=20)3050305004030400思路:假设最开始所有的都在B集合,通过dfs搜索,将数量从1-......
  • [转帖]OS、PFS、DFS 有啥区别?一文搞懂 6 大临床试验终点
    https://oncol.dxy.cn/article/670607 说到肿瘤临床研究,就不得不说临床试验终点(EndPoint),比如大家熟知的OS、PFS、ORR还有DFS、TTP、TTF……不同的终点服务于不同的研究目的。让我们一起来看看常用的临床试验终点都有什么区别以及优缺点。总生存overallsurvival,OS......
  • 图论——浅谈理论,DFS序和欧拉序
    图论——浅谈理论,DFS序、时间戳和欧拉序提示:本文在树论基础上。下文图例DFS序:124579836.欧拉序:124457997885236631.回加欧拉序:124257975852123631.下文举例均指此图。DFS序周所周知,DFS为深度优先遍历,其框架如:voiddfs(i......
  • 搜索学习笔记+杂题 (进阶二 dfs/bfs的进阶)
    前言:由于搜索的题还是做的太少了,所以以后有可能会不定期更新。四、还是进阶的dfs/bfs相关题单:戳我1、dfs(1)meetinthemiddleP2962[USACO09NOV]LightsG颠覆了我对折半搜索的认知,果然,只要满足了折半搜索的几个性质,基本上都可以使用折半搜索来处理。首先我们拿到的是一张......
  • 搜索学习笔记+杂题 (进阶一 dfs/bfs的进阶)
    前言:没啥好说的了。所以只能来写博客了。搜索杂题:相关题单:戳我二、进阶dfs/bfs1、dfs进阶——折半搜索(meetinthemiddle)由于深搜的时间复杂度在每种状态有两个分支的情况下是\(O(2^n)\)。所以一般暴力深搜的数据范围就在\(20-25\)之间。而对于有一大类的题,它的搜索思......
  • 实验三HDFS 常用操作
    HDFS常用操作使用hadoop用户名登录进入Linux系统,启动Hadoop,参照相关Hadoop书籍或网络资料,或者也可以参考本教程官网的“实验指南”栏目的“HDFS操作常用Shell命令”,使用Hadoop提供的Shell命令完成如下操作:(1)启动Hadoop,在HDFS中创建用户目录“/user/hadoop”......
  • DFS求LCA
    Updateon2023.7.17:该技巧目前已知的最早来源:skip2004。Updateon2023.7.17:比较时,取时间戳较小的结点也是正确的,不用记录深度。DFS序求LCA无论是从时间常数,空间常数还是好写程度方面均吊打欧拉序。定义DFS序表示对一棵树进行深度优先搜索得到的结点序列,而时间戳DF......
  • 搜索学习笔记+杂题 (基础二 dfs/bfs的拓展)
    搜索杂题:博客中讲述的题的题单:戳我二、dfs/bfs的各种变式1、深搜深搜以指数级的时间复杂度闻名,稍不注意时间就会爆炸,所以一般会用到剪枝的技巧(这个技巧基本上是因题而异,需要平时的刷题与积累)。深搜同样也是一种可变性极高的算法(其实都可以不叫做一种算法,深搜已经是一种做题的......
  • abc099d<dfs,枚举排列方案>
    题目D-GoodGrid思路用一个对角线上颜色相同,间隔3个对角线上颜色相同,一共分为3组;考虑在c种颜色中,选择3种,分配给这3组,共\(A(n,3)\)种选法;dfs枚举排列方案,对每种方案计算花费,取最优即可。总结dfs枚举排列方案;代码点击查看代码#include<iostream>#include<algor......
  • FastDFS 介绍
    一、介绍FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。FastDFS为互联网量身定制,充分考虑了冗余备份、负载......