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 ...
随机推荐
- IOS做一个简单计算器
//声明非原创 步骤: 1.打开Xcode,单机Creat a new Xcode project 2.左边选择ios下Application,右边选择single view Application ...
- .NET中的 枚举
我理解的枚举就是编程中约定的一个"可选值":例如QQ的在线状态,分别有 在线,Q我吧,隐身,忙碌等等...我觉得这就是一个枚举. 1.普通枚举 1) 实例 public en ...
- 【风马一族_Java】如何获取ACSLL表的值
消耗两小时,只为一代码. 终于得到了此代码: public class sows { public static void main(String[] args) { byte[] bytes = n ...
- 测试使用Windows Live Writer
目前是在win7系统下面使用的,曾经在winxp下去配置,却失败了,难道不支持xp? Windows Live Writer好像不支持代码关键字高亮显示啊. int main(void) { prin ...
- intellij idea 代码正常,但是编译出现 java:需要";"
1. 查看idea 的maven 插件是不是版本太低,发现应用里是用的jdk是1.7 maven插件是2.2.1 2. 查看应用编码,比如部分文件是GBK,里面有中文,而整个应用的编码是Utf-8
- mvvm结构中数据的关联----wpf
1.在视图中PlotView.xaml <Button Content="<<" Height="23" HorizontalAlignmen ...
- .Net码农学Android---前言
自从毕业参加工作后,就一直想学移动领域得开发,但时间.精力.决心.学习成本等这些问题总在不同程度的阻碍着自己. 但这段时间自己想做一款属于自己的App的想法越来越强烈,我感到自己快压不住这股能量了.终 ...
- MAC 平台 QT编写iphone程序,加载iphone模拟器失败解决办法
本日这么多年一直做C++开发,最近要做QT项目,被QT做界面的新特性所吸引.QSS QML的确是亮点. 还有一个就是跨平台这方面,自己玩了玩. 用的QT 的开发包是在官网上下载 qt-opensour ...
- C# 清楚Cookies
//销毁Cookies中的数据 if (Request.Cookies["Ticket"] != null) { HttpCookie mycookie; mycookie = R ...
- SharePoint 101 Code Samples are now available
The Microsoft Office Developer Center has created 101 code samples for SharePoint 2010. These sample ...