第二次搜索回溯
#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);
}
草率结束