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 }