题解 | #神奇的口袋#

神奇的口袋

https://www.nowcoder.com/practice/9aaea0b82623466a8b29a9f1a00b5d35

//采用递归的思想(dfs)
#include "stdio.h"
int N;
int count;//记录解决方案个数
int array[30];//记录物品重量
bool isUesd[30];//记录物品被选择情况,false为未选择
void calculate(int weight,int pos){//weight为当前还剩的重量,pos为上一个物品的下标
    if(weight == 0){
        ++count;
        return;
    }
    for (int i = pos; i < N; ++i) {//要从pos开始,不然会多算情况。而且这样并不少算情况
        if(isUesd[i] == false){    //因为要选择的几样物品必然可以通过从前到后的次序选择出来
            isUesd[i] = true;//拿去array[i]
            calculate(weight - array[i],i);
            isUesd[i] = false;//算完后还要放回array[i]
        }
    }
    return;
}

int main(){
    scanf("%d",&N);
    for (int i = 0; i < N; ++i) {
        scanf("%d",array+i);
        isUesd[i] = false;
    }
    calculate(40,0);
    printf("%d",count);
}

全部评论

相关推荐

notbeentak...:孩子,说实话,选择很重要,可能你换一个方向会好很多,但是现在时间不太够了,除非准备春招
点赞 评论 收藏
分享
27届毕业,最近想找一段大厂实习,感觉简历有些问题,好多都不给面,求大佬们指点,最近好焦虑
后端劝退第91人:我从后端的角度分析一下你的第一个项目,我感觉亮点不是很突出。因为我是因为组内有需求,临时上手学react干活。我用到的技术基本就cover你那个智慧园区管理平台的很多亮点了。那作为比较专业的前端,你上述的内容是不是有点单薄呢。感觉还得包装
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务