#include <iostream> #include <cstring> using namespace std; int f[301]; int n, c; int main() { while(cin >> n >> c) { memset(f, 0, sizeof(f)); f[0] = 1; for(int i = 0; i < c; i++){ int tmp; cin >> tmp; for(int j = tmp; j <= n; j++) { f[j] += f[j - tmp]; } } cout << f[n] << endl; } return 0; }
其实我第一次做是用搜索做的,可能数据比较水。过了。不过时间用了0.45s,DP就0s;
#include <iostream> using namespace std; int n, c, count; int coins[300]; void _find(int sum, int cur) { sum -= coins[cur]; for(int i = 0; (sum = sum + coins[cur]) <= n; i++) { if(sum == n) { count++; return; } if(cur < c - 1) _find(sum, cur + 1); } } int main() { while(cin >> n >> c) { for(int i = 0; i < c; i++) cin >> coins[i]; count = 0; _find(0, 0); cout << count << endl; } return 0; }
本文介绍了解决背包问题的两种方法:动态规划与搜索算法。通过动态规划方法,实现了高效的求解,时间复杂度接近于0s;而搜索算法虽然也能解决问题,但效率较低。文章通过具体的代码示例展示了两种算法的具体实现。
1324

被折叠的 条评论
为什么被折叠?



