您的位置:首页 > 其它

POJ 1416 Shredding Company <DFS>

2017-07-08 21:04 435 查看
题目传送门

题目大意:给出一个目标数字和一个用来切分的数字(长度均不大于6,没有前导0),求切分方案,使得切分的各段之和最接近目标数字但是又不大于目标数字。如果不能找到这样的切分,则输出“error”,如果有多个满足要求的方案,则输出“rejected”,否则则输出那个唯一的切分方案。

分析:这本是一道水题,简单DFS。但我还是想纪念一下自己做题水平的一个小小提高。刚开始刷题那会儿,因为是英文题,常常要读很久的题,有时干脆百度看别人解题报告的题目大意,而现在我已经能够很轻松地快速地阅读并理解题目了,这也算英语水平的提高吧。还有就是刚开始常常是看了大牛们的代码才能写出来,而现在我也能独立思考并给出自己的解法,这道题我就是不到一个小时内1A的,虽是水题,但这种完全独立完成,并且发现比网上我经常学习的大牛们的代码还要精简的感觉,还是挺棒的,继续加油吧!

代码

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
using namespace std;
int tar,n;
string nums;
string ans;
string cut;
int sum;
int cans;
bool flag;

void dfs(int d,int cur){
if(d==n-1){
cut.push_back('1');
sum+=(cur*10+nums[d]-'0');
if(sum>tar) ;
else if(sum>cans){
ans=cut;
cans=sum;
flag=false;
}
else if(sum==cans){
flag=true;
}
return ;
}
string tempS=cut;
int temp=sum;
cut.push_back('0');
if(sum<=tar) dfs(d+1,cur*10+nums[d]-'0');
cut=tempS+'1';
sum=temp+(cur*10+nums[d]-'0');
if(sum<=tar) dfs(d+1,0);
}

int main(){
while(cin>>tar>>nums,tar||(nums!="0")){
sum=cans=0;
cut.clear();
n=nums.size();
flag=false;
dfs(0,0);
if(flag) cout<<"rejected"<<endl;
else if(!cans) cout<<"error"<<endl;
else{
cout<<cans<<' ';
for(int i=0;i<n;++i){
cout<<nums[i];
if(ans[i]=='1') printf("%c",i==n-1?'\n':' ');
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dfs poj