题解 搜索回溯(二)

第二次搜索回溯

#include<bits/stdc++.h>
using namespace std;//数串求和 

int a[10007],ans[10007],sum[10007],n,c;

void print(int n) {//输出函数 
	for (int i=1; i<n; i++) {
		printf("%d ",ans[i]);
	}
	printf("\n");
	exit(0);//结束 
}

void search(int x,int t,int k) {//搜索函数 
	if (t>c) { 
		return ;
	}
	if (t==c) {
		print(k);
	}
	if (t+sum[x]<c) {
		return ;
	}
	for (int i=x; i<=n; i++) {
		ans[k]=a[i];
		search(i+1,t+a[i],k+1);//第i+1个数,和为t+a[i],使用数为k+1 
	}
}

int main() {
	scanf("%d%d",&n,&c);
	for (int i=1; i<=n; i++) {
		scanf("%d",&a[i]);
	}
	for (int i=n; i>0; i--) {//求和简化 
		sum[i]=sum[i+1]+a[i];
	}
	if (sum[1]>=c) {
		search(1,0,1);//第一个数开始,此时和为0,使用了一个数 
	}
	printf("No Solution!");//大写 
	return 0;
}


#include<bits/stdc++.h>
using namespace std;//工作酬金 

int n,a[21][21],min1=99999,sum=0;
bool b[21];

void dfs(int t) {//搜索函数 
	if(t>=n) {
		if(min1>sum) {
			min1=sum;//替换最小值 
			return;
		}
	}
	for(int i=0; i<n; i++) {
		if(!b[i]) {
			b[i]=1;
			sum+=a[t][i];
			if(sum<min1) {
				dfs(t+1);//t+1个数继续搜索 
			}
			b[i]=0;
			sum-=a[t][i];
		}
	}
}

int main() {
	scanf("%d",&n);
	for(int i=0; i<n; i++) {
		for(int j=0; j<n; j++) {
			scanf("%d",&a[i][j]);
		}
		b[i]=0;
	}
	dfs(0);//从第0个数开始 
	printf("%d\n",min1);
	return 0;
}

#include<bits/stdc++.h>
using namespace std;//装载问题

int n,m=0,a[27],c,d[27],g[27],y;//n货物数,m最大值
//a各个货物重量,c界限,d是否使用过
//g现船上重量和,y方案重量和 

void dfs(int t) {//搜索函数
	int i;
	if(t>n) {//处理比较 
		for(i=1; i<=n; i++) {//计算总和 
			y+=d[i];
		}
		if(y>m) {
			m = y;//替换最大 
		}
	} else {
		if(g + a[t] <=c) {//是否在界限  
			d[t] = 1;
			g += a[t];
			dfs(t+1);//t+1开始,包含t
			g-=a[t];
		} else {
			d[t] = 0;
			dfs(t+1);//t+1开始,不包含t
		}
	}
}

int main() {
	int total=0;
	scanf("%d%d",&n,&c);
	for(int i = 1; i <= n ; i++) {
		scanf("%d",&a[i]);
	}
	dfs(1);//从第一个数开始
	printf("%d",total);
}

#include<bits/stdc++.h>
using namespace std;//字符序列 

int sum = 0,n;
char x[4] = { ' ', 'A', 'B', 'C' };
string a;

bool same(string s) {//string 
	int len = s.length();//字符数组 
	string g;
	for (int i = 1; i < len - 1; i++) {
		if (g == s.substr(i, 2)) {
			return 1;
		}
		g = s.substr(i - 1, 2);
	}
	return 0;
}

void dfs(int t) {
	if (t == n) {
		if (same(a) == 0)
			sum++;
		return;
	}
	for (int i = 1; i <= 3; i++) {
		a.push_back(x[i]);
		dfs(t + 1);
		a.erase(t, 1);
	}
}

int main() 
	{
	scanf("%d",&n);
	dfs(0);//从第0位数开始 
	printf("%d",sum);
}


草率结束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值