zcmu oj 1711: 背包
题目描述
你有一个神奇的背包,他的容积是m(0<m<=80),只有你装满他,你才能拿走他,现在给你n(1<=n<=20)个物品Xi(Xi<=m),那么一共有几种方式,可以让你拿走背包?
输入
第一行 n,m
第二行 n个数字
输出
输出方案数
样例输入
3 40
20 20 20
样例输出
3
分析:需要用到dfs的思想。
#include<bits/stdc++.h>
using namespace std;
int a[30];
int mark[30];
int n, p, m;
void dfs(int step, int sum) {
if (sum > m) {
return; // 如果当前sum已经大于m,直接返回
}
if (step == n) {
if (sum == m) {
p++; // 如果sum等于m,增加计数
}
return;
}
dfs(step + 1, sum + a[step]); // 选择当前元素
mark[step] = 1; // 标记当前元素为已访问
dfs(step + 1, sum); // 不选择当前元素
mark[step] = 0; // 恢复标记
}
int main() {
memset(mark, 0, sizeof(mark)); // 初始化mark数组为0
while(cin >> n >> m )
{
for (int i = 0; i < n; i++) {
cin >> a[i];
}
p = 0; // 初始化计数器
dfs(0, 0); // 从第一个元素开始,sum初始化为0
cout << p << endl;
}
return 0;
}