4.3 递归
4.3 递归
http://codeup.hustoj.com/contest.php?cid=100000583
C 神奇的口袋

题目解析
这道题据说也是个DP题目,参考https://blog.csdn.net/NeverWA/article/details/79873581
(等我学了DP再来看这道题🙃️)
代码
#include <cstdio>
#include <cstring>
int n, a[25], count;
void generatea(int index, int sum) { //前index个物品总体积为sum
if (sum == 40) {
count++;
return;
}
if (index == n + 1 || sum > 40) return;
generatea(index + 1, sum + a[index + 1]); //选第index+1个物品
generatea(index + 1, sum); //不选第index+1个物品
}
int main() {
while (scanf("%d", &n) != EOF) {
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
count = 0;
generatea(0, 0);
printf("%d\n", count);
}
return 0;
}
D 八皇后

题目解析
将八皇后问题所有的解事先存储在数组a中,到时候查询即可。(hash)
⚠️这里比较特殊的是行号和列号取值范围都为1~8,所以在写for语句和取hastTable的范围时要特别注意。
求解把八皇后:
-
int类型temp数组存储某种排序,temp[i] 中i表示行号、temp[i]表示列号【使用从temp[1]开始】;
hashTable存储第i列是否已经被选取;
c表示解决方案的个数。
-
index表示当前排列第index行的皇后,当index=n+1时,表示一个序列取完了。将之存储到a数组中。
代码
#include <cstdio>
#include <algorithm>
#define n 8
using namespace std;
int a[92];
int temp[n+1], c = 0;
bool hashTable[n + 1] = {false};
void generateP(int index) {
if (index == n + 1) {
int sum = 0;
for (int i = 1; i <= n; i++) {
sum = sum * 10 + temp[i];
}
a[c++] = sum;
return;
}
//第index行的列号需遍历1~8的取值
for (int i = 1; i <= n; i++) {
if (!hashTable[i]) {
bool flag = true;
// 遍历之前已经取的皇后的行号
for (int j = 1; j < index; j++) {
// 第index行的列号为i,第j行的列号为temp[j]
if (abs(index - j) == abs(i - temp[j])) {
flag = false;
break;
}
}
if (flag) {
temp[index] = i;
hashTable[i] = true;
generateP(index + 1);
hashTable[i] = false;
}
}
}
}
int main() {
generateP(1);
sort(a,a+92);
int m,k;
while(scanf("%d",&m)!=EOF){
while(m--){
scanf("%d",&k);
printf("%d\n",a[k-1]);
}
}
return 0;
}
本文作者:Joey-Wang
本文链接:https://www.cnblogs.com/joey-wang/p/14541166.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步