#include<stdio.h>
#include<stdlib.h>
#define N 100
int m,len=1;
int w[N];
bool x[N];
void print(bool x[],int n){//输出当前解
printf("{ ");
for(int i=1;i<=n;i++){
if(x[i]==1) printf("%d ",i);
}
printf("}");
}
void subset(int t,int k,int r){
x[k]=1;
if(t+w[k]==m){
print(x,k);
}
else{
//现在条件为t+w[k]<m或者t+w[k]>m,
//(1)如果t+w[k] > m,那么必定无解,因为假设的t<m,现在t+w[k] > m,必定无解;
//(2)如果t+w[k]<m,那么可能有解,
if(t+w[k]+w[k+1] <= m){//选择w[k],对应情况(2),此时自动满足t+w[k]<=m和(t+w[k])+ (r-w[k])>m
subset(t+w[k],k+1,r-w[k]);
}
if((t+r-w[k] >= m) && (t+w[k+1] <= m)){//对应不选择w[k],此时t+0
回溯法-子集和问题
最新推荐文章于 2023-10-23 20:00:46 发布