递归和回溯 POJ 2034 Anti-prime Sequences

#include <iostream> using namespace std; #define N 1000 int n, m, d; bool isp[N * 10 + 1]; bool vis[N]; int rcd[N]; bool isPrime(int n) { int a = 2; while(a < n) if (!(n%a++)) break; if(a == n) return 1; return 0; } void init() { for(int i = 2; i <= N * 10; i++) { isp[i] = isPrime(i); } } bool isDComposite(int cur, int num) { if (cur < 1) { return true; } int k = 0; if(cur - d + 1 >= 0) { k = cur - d + 1; } int sum = num; for(int i = cur-1; i >= k; i--) { sum += rcd[i]; if(isp[sum]) { return false; } } return true; } bool dfs(int cur) { if(cur == m-n+1) { return true; } else { for(int i = n; i <= m; i++) { if(!vis[i] && isDComposite(cur, i)) { vis[i] = true; rcd[cur] = i; if(dfs(cur+1)) { return true; } vis[i] = false; } } return false; } } int main() { init(); while(true) { cin >> n >> m >> d; if (n == 0 && m == 0 && d == 0) { return 0; } for(int i = n; i <= m; i++) { vis[i] = false; } if(dfs(0)) { for(int i = 0; i < m-n; i++) { cout << rcd[i] << ","; } cout << rcd[m-n] << endl; } else { cout << "No anti-prime sequence exists." << endl; } } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用递归回溯和迭代回溯算法来解决0-1背包问题的C++程序示例: ```cpp #include <iostream> #include <vector> using namespace std; struct Item { int weight; int value; }; int max(int a, int b) { return (a > b) ? a : b; } // 递归回溯算法 int recursiveBacktracking(vector<Item> items, int capacity, int index) { if (index < 0 || capacity == 0) { return 0; } if (items[index].weight > capacity) { return recursiveBacktracking(items, capacity, index - 1); } else { return max(recursiveBacktracking(items, capacity, index - 1), items[index].value + recursiveBacktracking(items, capacity - items[index].weight, index - 1)); } } // 迭代回溯算法 int iterativeBacktracking(vector<Item> items, int capacity) { int n = items.size(); vector<vector<int>> dp(n + 1, vector<int>(capacity + 1)); for (int i = 0; i <= n; i++) { for (int w = 0; w <= capacity; w++) { if (i == 0 || w == 0) { dp[i][w] = 0; } else if (items[i - 1].weight <= w) { dp[i][w] = max(items[i - 1].value + dp[i - 1][w - items[i - 1].weight], dp[i - 1][w]); } else { dp[i][w] = dp[i - 1][w]; } } } return dp[n][capacity]; } int main() { vector<Item> items = {{10, 60}, {20, 100}, {30, 120}}; int capacity = 50; // 使用递归回溯算法求解 int max1 = recursiveBacktracking(items, capacity, items.size() - 1); cout << "递归回溯算法求解结果: " << max1 << endl; // 使用迭代回溯算法求解 int max2 = iterativeBacktracking(items, capacity); cout << "迭代回溯算法求解结果: " << max2 << endl; return 0; } ``` 在这个示例中,我们定义了一个`Item`结构体来表示每个物品的重量和价值。然后,我们实现了`max`函数来返回两个整数中较大的一个。 接下来,我们分别实现了递归回溯算法和迭代回溯算法来解决0-1背包问题。 在`main`函数中,我们创建了一个包含三个物品的向量,并设置背包容量为50。然后,我们分别使用递归回溯算法和迭代回溯算法来求解背包问题,并将结果输出到控制台。 你可以根据自己的需求修改物品向量和背包容量,运行程序以获取不同情况下的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值