poj sum it up

本文介绍了一种使用深度优先搜索(DFS)算法解决子集和问题的方法,即从一组给定的整数中找到若干个数,使得它们的总和等于目标值t,并确保这些数非递增且不重复。

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


 链接:http://poj.org/problem?id=1564

题目大意:给一个t和n个数要你找出在n个数中找出哪几个数相加和为t,条件是这几个数不能重复且非递增


用深搜来求


收获:在有序的时候判断重复和怎么样非递增遍历


#include<iostream>
using namespace std;
int in[15],out[15],use[15]={0};
int t,n,flag,sum;
void dfs(int s,int k)
{
	if(sum>t) return;
	if(sum==t)
	{
		for(int b=0;b<k;b++)
			if(b==0)
				printf("%d",out[b]);
			else
				printf("+%d",out[b]);
		printf("\n");
		flag=1;//标记有没有和为t的
		return;
	}
	int j=-10;
	for(int a=s;a<n;a++)
	{
		if(!use[a]&&j!=in[a])//j!=in[a]用于判断后面有没有相同的数,有的话就跳过
		{
			j=in[a];
			use[a]=1;
			out[k]=in[a];
			sum=sum+in[a];
			dfs(a,k+1);//注意,想要非递增的话这里是a而不是s+1,
			use[a]=0;
			sum=sum-in[a];//每次回溯记得减in[a]
		}
	}
}
int main()
{
	while(scanf("%d%d",&t,&n),t+n)
	{
		int a=0;
		memset(in,0,sizeof(in));
		for(a=0;a<n;a++)
		{
			scanf("%d",&in[a]);
		}
		printf("Sums of %d:\n",t);
		sum=flag=0;
		memset(use,0,sizeof(use));//忘记初始化了...
		memset(out,0,sizeof(out));
		dfs(0,0);//用两个参数比用一个参数容易些
		if(flag==0)
			printf("NONE\n");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值