DFS深度优先搜索解题
这题大多数人应该都是用的dp,我采用了dfs来解题,提供一种思路。
#include<iostream>
using namespace std;
const int maxN = 20;
int v[maxN];//邮票价值
int m;//总值
int n;//邮票数量
int minK;//最小数量
//index为当前搜索的邮票编号,sum为当前搜索的价值和,k为当前搜索结果的邮票数量
void dfs(int index, int sum, int k) {
//搜索成功
if (sum == m) {
if (k < minK) {
minK = k;
return;
}
}
//剪枝
if (index >= n || sum > m)
return;
//选择当前邮票
dfs(index + 1, sum + v[index], k + 1);
//不选择当前邮票
dfs(index + 1, sum, k);
}
int main() {
while (cin >> m >> n) {
//初始化最小数量为邮票总数
minK = n;
for (int i = 0; i < n; ++i) {
cin >> v[i];
}
dfs(0, 0, 0);
//结果未曾改变,即无解,输出0
if (minK == n) {
cout << 0 << endl;
} else {
cout << minK << endl;
}
}
return 0;
}