hdu 4277 USACO ORZ

本文通过实例演示如何利用深度优先搜索(DFS)解决特定问题,包括代码实现与关键步骤解析。

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

没什么好方法,只能用dfs了。

代码如下:

 

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<set>
 7 #define I(x) scanf("%d",&x)
 8 using namespace std;
 9 int a[20],n,ans;
10 set<pair<int,int> > p;
11 void dfs(int pos,int sum1,int sum2,int sum3)
12 {
13     int i,j,k;
14     if(pos==n){
15         if(sum2==0||sum3==0) return ;
16         i=min(sum1,sum2);
17         i=min(i,sum3);
18         j=max(sum1,sum2);
19         j=max(j,sum3);
20         if(p.find(make_pair(i,j))!=p.end()) return ;
21         if(sum1+sum2>sum3&&abs(sum1-sum2)<sum3){
22             ans++;
23             p.insert(make_pair(i,j));
24         }
25         return;
26     }
27     dfs(pos+1,sum1+a[pos],sum2,sum3);
28     dfs(pos+1,sum1,sum2+a[pos],sum3);
29     dfs(pos+1,sum1,sum2,sum3+a[pos]);
30 }
31 int main()
32 {
33     int t,i;
34     I(t);
35     while(t--){
36         I(n);
37         p.clear();
38         for(i=0;i<n;i++) I(a[i]);
39         ans=0;
40         dfs(1,a[0],0,0);
41         printf("%d\n",ans);
42     }
43     return 0;
44 }
View Code

 

 

 

转载于:https://www.cnblogs.com/xin-hua/p/3267857.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值