poj 1416 Shredding Company( dfs )

本文介绍了一道关于数字切割的问题,目标是将一个数字切割成若干部分,使得这些部分的总和小于或等于另一个给定的数值,并尽可能地使切割后的最大总和最大化。文章提供了一个基于深度优先搜索(DFS)的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 我的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值