poj 1416 Shredding Company( dfs )

 我的dfs真的好虚啊……,又是看的别人的博客做的 题目==

题目:http://poj.org/problem?id=1416

题意:给你两个数n,m;n表示最大数,m则是需要切割的数。

切割m,使得切割之后的数的和小于等于n。

求出最大的切割方法;

例: 50 12346

12346可以切割为 1 2 34 6和为43,这个数小于n。

12346也可以切割为1 2 3 4 6和为16,这个数也小于n;

但是43大于16,所以去43而不取16;

参考博客:http://www.cnblogs.com/luyingfeng/

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<stack>
 6 #include<queue>
 7 #include<iomanip>
 8 #include<cmath>
 9 #include<map>
10 #include<vector>
11 #include<algorithm>
12 using namespace std;
13 
14 int m,n,a[1100],t[1100];
15 int _max,r,ansk;
16 void dfs(int n,int sum,int now,int k,int p)
17 {
18     if(!n)
19     {
20         t[k]=now;
21         if(sum+now>m) return;
22         if(sum+now==_max) r++;
23         else if(sum+now>_max)
24         {
25             _max=sum+now;
26             r=1;
27             ansk=k;
28             for(int i=1; i<=k; i++)
29             a[i]=t[i];
30         }
31         return;
32     }
33     int mm=n%10;
34     dfs(n/10,sum,now+p*mm,k,p*10);
35     t[k]=now;
36     dfs(n/10,sum+now,mm,k+1,10);
37 }
38 int main()
39 {
40     while(cin>>m>>n&&(m!=0||n!=0))
41     {
42         _max=0; r=0;
43         dfs(n/10,0,n%10,1,10);
44         if(_max==0)
45         {
46             cout<<"error"<<endl;
47             continue;
48         }
49         if(r>1)
50         {
51             cout<<"rejected"<<endl;
52             continue;
53         }
54         cout<<_max;
55         for(int i=ansk; i>=1; i--)
56         cout<<" "<<a[i];
57         cout<<endl;
58     }
59     return 0;
60 }
原文地址:https://www.cnblogs.com/bfshm/p/3293531.html