曾经沧海难为水,除却巫山不是云。|

Joey-Wang

园龄:4年3个月粉丝:17关注:0

4.3 递归

4.3 递归

http://codeup.hustoj.com/contest.php?cid=100000583

C 神奇的口袋

image-20200706193903088

题目解析

这道题据说也是个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 八皇后

image-20200706194309945

题目解析

将八皇后问题所有的解事先存储在数组a中,到时候查询即可。(hash)

⚠️这里比较特殊的是行号和列号取值范围都为1~8,所以在写for语句和取hastTable的范围时要特别注意。

求解把八皇后:

  1. int类型temp数组存储某种排序,temp[i] 中i表示行号、temp[i]表示列号【使用从temp[1]开始】;

    hashTable存储第i列是否已经被选取;

    c表示解决方案的个数。

  2. 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 中国大陆许可协议进行许可。

posted @   Joey-Wang  阅读(36)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开