POJ1416Shredding Company
http://poj.org/problem?id=1416
题意 : 要为碎纸机公司开发一种新的碎纸机,这种碎纸机要具有3个特性 :一是粉碎机以一个目标数 t 作为输入,并且粉碎的纸上写有一个数字n,二是碎纸机将纸粉碎成碎片的时候每张碎片上都要有这个数字的一位或者数位,三是每张碎片上数字的总和尽可能地接近目标数 t ,但不可以超过 t ,可以等于 t 。如果目标数与纸张上的数字相同,则不要粉碎,如果任何组合的总和不可能小于或者等于目标数 t ,就输出error,例如,如果目标数 t = 1,但是纸上的数是123的话,就算最小的组合也是6,所以不满足要求。还有若是有多个符合要求的,也就是说有多个总和接近目标数 t 但是没有超过目标数 t的,就输出rejected。最后输出的话,除了error还有rejected,另一种输出就是先输出符合条件的组合加起来的总和,再输出这个组合的每一部分,空格隔开
思路 : 所有碎纸片上的最佳数字和为max,所以要先判断和为max的拆分方案数是1还是大于1还是等于0,,而求这个最佳数字和max,我们从右往左按位拆分,若当前拆分出 i 位数,则n%(10^i),为当前碎纸片上的数字,剩余数字n/(10^ i )待拆分,而拆分有两种情况 :
不断开 : 当前碎纸片上的数字继续向左扩展
断开 : 拆分出当前碎纸片上的数字,所以,可以采用回溯法分头递归这两种情况
#include<cstdio>
#include<cstring>
#include<iostream>
const int maxn = ;
int m,n;
int ans[maxn],t[maxn];
int maxx,r;
int ansk;
void dfs(int n,int sum,int now,int k,int p)
{//n为待拆分数字,sum为已拆分出的输的和,now为当前待拆分出的一个数字,准备填入第k张碎纸片,
//p为下一个十进制位的权
if(n==)
{
t[k]=now;
if(sum+now>m) return;//若拆分出的数和大于目标数则退出,
if(sum+now==maxx) r++;//若拆分出的数和相同于maxx,那就使组合个数加1
else if(sum+now>maxx)//若拆分出的数和更佳,就更新为maxx
{
maxx=sum+now;
r=;//数和为maxx的组合为1
ansk=k;//已填数的碎纸片数和各张碎纸片数的填数记入最佳方案
for(int i=; i<=k; i++) ans[i]=t[i];
}
return ;//回溯
}
int mm=n%;//取待拆分数的个位数
dfs(n/,sum,now+p*mm,k,p*);//递归不断开的情况
t[k]=now;
dfs(n/,sum+now,mm,k+,);//断开的情况
}
int main()
{
while(scanf("%d%d",&m,&n)&&m&&n)
{
maxx=,r=;
dfs(n/,,n%,,);
if(maxx==)
{
printf("error\n");
continue;
}
if(r>)
{
printf("rejected\n");
continue;
}
printf("%d",maxx);
for(int i=ansk; i>=; i--)
printf(" %d",ans[i]);
printf("\n");
}
return ;
}
POJ1416Shredding Company的更多相关文章
- Elasticsearch索引(company)_Centos下CURL增删改
目录 返回目录:http://www.cnblogs.com/hanyinglong/p/5464604.html 1.Elasticsearch索引说明 a. 通过上面几篇博客已经将Elastics ...
- Microsoft Dynamics AX 2012: How to get Company,Customer and Vendor address in AX 2012
Scenario: “How to get Addresses of “Customer, Vendor and Company” 1) First we need to identify ...
- poj1416 Shredding Company
Shredding Company Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5379 Accepted: 3023 ...
- CodeForces 125E MST Company
E. MST Company time limit per test 8 seconds memory limit per test 256 megabytes input standard inpu ...
- CF 321B Kefa and Company(贪心)
题目链接: 传送门 Kefa and Company time limit per test:2 second memory limit per test:256 megabytes Desc ...
- 搜索+剪枝 POJ 1416 Shredding Company
POJ 1416 Shredding Company Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5231 Accep ...
- 二分+动态规划 POJ 1973 Software Company
Software Company Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 1112 Accepted: 482 D ...
- 【Moqui业务逻辑翻译系列】Story of Online Retail Company 在线零售公司的故事
h1. Story of Online Retail Company 在线零售公司的故事 Someone decides to sell a product. [Product Marketer Ma ...
- Codeforces 556D Restructuring Company
传送门 D. Restructuring Company time limit per test 2 seconds memory limit per test 256 megabytes input ...
随机推荐
- JDK 与 JRE (转)
很多程序员已经干了一段时间java了依然不明白jdk与jre的区别.JDK就是Java Development Kit.简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境. ...
- 双机倒换(NewStartHA,SKYbility,hacmp,hp unix双机)
1.Suse linux (NewStartHA): # cli cli:~>service-migrate Select service to migrate: ...
- linq 日常关键字使用
1.from var scoreQuery = from student in students from score in student.Scores where score > 90 se ...
- win7局域网无法ping通本机的问题解决方法
对于window7系统,很多朋友会发现:默认下是不允许被ping的,其实都系统自带的防护墙所阻止了,新建一个策略就可以实现被ping通,如下操作
- Android砖机救活(索爱MT15i)
前言 接触Android时间长了就想编译一套属于自己的系统,摘取不必要的那些组件,然后刷到手机上,俗话说的好,“常在河 边走,哪有不湿鞋”.果不其然,刷完自己编译的系统手机变砖了,具体情况为 开不开机 ...
- rinetd 安装使用
1 下载解压: wget http://www.boutell.com/rinetd/http/rinetd.tar.gz tar zxvf rinetd.tar.gz 2 手动建立目录 mkdir ...
- js阻止冒泡事件及默认操作
1. 事件目标 现在,事件处理程序中的变量event保存着事件对象.而event.target属性保存着发生事件的目标元素.这个属性是DOM API中规定的,但是没有被所有浏览器实现 .jQuery对 ...
- HTML5特性:使用async属性异步加载执行JavaScript
HTML5让我兴奋的一个最大的原因是,它里面实现的新功能和新特征都是我们长久以来一直期待的.比如,我以前一直在使用placeholders,但以前必须要用JavaScript实现.而HTML5里给Ja ...
- WPF之UseLayoutRounding和SnapsToDevicePixels
最近在工作中看别的朋友XML代码时,发现SnapsToDevicePixels 属性然后通过查询资料了解其作用 1)UserLayoutRounding为False,导致控件布局相对屏幕若不是整数则不 ...
- Oracle计算两个整数的和与这两个整数的差与商
PL/SQL(Procedural Language/SQL)是一种过程化语言. PL/SQL都是以(BLOCK)块为基本单位,整个PL/SQL块分为三部分 1.声明(Declare) 2.执行(以B ...