回溯算法模板
result = []
void backtrack(路径,选择列表)
if 满足结束条件
result.add(路径)
return
for 选择 in 选择列表 do
做选择
backtrack(路径,选择列表)
撤销选择
AC代码
#include <algorithm>
#include <cstdio>
using namespace std;
const int maxn = 21;
int n;//n代表不同的物品的数目
int ans = 0;
bool vis[maxn] = {false};
void backtrack(int item[], int k, int sum){
if(sum == 40){
ans++;
return;
}
// 求解空间第i个位置上的下一个解
for(int i = k; i < n; i++){
if(vis[i] || sum + item[i] > 40) continue;
vis[i] = true;//做选择
backtrack(item, i, sum + item[i]);// backtrack(路径,选择列表)
vis[i] = false; //撤销选择
}
}
int main(){
scanf("%d", &n);
int item[maxn];
for(int i = 0; i < n; i++){
scanf("%d", &item[i]);
}
sort(item, item + n);
int k, sum;//k记录当前选择物品数目,sum记录当前选择物品总体积
backtrack(item, 0, 0);
printf("%d\n", ans);
return 0;
}