美文网首页
《算法笔记》dfs

《算法笔记》dfs

作者: Celia_QAQ | 来源:发表于2019-05-16 19:55 被阅读0次
图片.png
#include<cstdio>
const int maxn=30;
int n,V,maxValue=0;
int w[maxn],c[maxn];

void dfs(int index,int sumW,int sumC){
    //sumW总重量,sumC总价值 
    if(index==n){
        if(sumW<=V&&sumC>maxValue){
            maxValue=sumC;
        }
        return ;
    }
    //岔道口 
    dfs(index+1,sumW,sumC);//不选index件物品 
    dfs(index+1,sumW+w[index],sumC+c[index]);//选第index件物品 
}
int main(){
    scanf("%d%d",&n,&V);
    for(int i=0;i<n;i++){
        scanf("%d",&w[i]);//每件物品重
    }
    for(int i=0;i<n;i++){
        scanf("%d",&c[i]);//价值 
    }
    dfs(0,0,0);
    printf("%d\n",maxValue);
    return 0;
}
结果显示

优化:


图片.png
#include<cstdio>
const int maxn=30;
int n,V,maxValue=0;
int w[maxn],c[maxn];

void dfs(int index,int sumW,int sumC){
    //sumW总重量,sumC总价值 
    if(index==n)
    { 
        return ;//已经完成对所有物品的选择 
    }
    
    dfs(index+1,sumW,sumC);//不选index件物品 
    //只有加入第INDEX件物品后未超过容量V才可以继续
    if(sumW+w[index]<=V){
        if(sumC+c[index]>maxValue){
        maxValue=sumC+c[index];//更新最大价值 
    } 
    dfs(index+1,sumW+w[index],sumC+c[index]);//选第index件物品 
    }
}
int main(){
    scanf("%d%d",&n,&V);
    for(int i=0;i<n;i++){
        scanf("%d",&w[i]);//每件物品重
    }
    for(int i=0;i<n;i++){
        scanf("%d",&c[i]);//价值 
    }
    dfs(0,0,0);
    printf("%d\n",maxValue);
    return 0;
}

再改动,保存最大平方和的方案:

int n,k,x,maxSumSqu=-1,A[maxn];
int sumSqu=0;
vector<int>temp,ans;//存放当前已经选择的整数 
//sumSqu当前已选整数平方和,sum当前已选整数 
void dfs(int index,int nowK,int sum,int sumSqu){
    if(nowK==k&&sum==x){
        if(sumSqu>maxSqu){
            maxSumSqu=sumSqu;//更新最大平方和 
            ans=temp;//更新最优方案 
        }
        return ;
    }
    //已经处理完n个数,或者超过n个数,或者和超过x,返回 
    if(index==n||nowK>k||sum>x)return ;
    //选index号数
    temp.push_back(A[index]);
    dfs(index+1,nowK+1,sum+A[index],sumSqu+A[index]*A[index]);
    temp.pop_back();
    //不选
    dfs(index+1,nowK,sum,sumSqu); 
}

相关文章

  • 《算法笔记》dfs

    优化: 再改动,保存最大平方和的方案:

  • BFS

    [TOC] BFS 和 DFS BFS广度有限搜索和DFS深度优先搜索算法是特别常用的两种算法 DFS 算法就是回...

  • DFS算法

    DFS算法 DFS算法即:Depth First Search,深度优先搜索。这个算法的关键是解决“当下如何做”,...

  • 《python算法教程》Day5 - DFS遍历图(邻接字典)

    这是《python算法教程》的第5篇读书笔记。这篇笔记的主要内容为运用DFS(深度优先搜索,depth first...

  • DFS算法

    核心思想:从一个顶点V开始,沿着一条路一直走到底,如果发现不能达到目标,那就返回到上一个结点,然后从另一条路开始走...

  • 基础之全排列

    很基本的算法,使用DFS实现

  • 北航算法复习笔记

    #算法复习笔记 一 决策和策略 二 回溯法使用深度优先(dfs)搜索状态空间树 三 快速排序 标准(常用)快速排序...

  • Combination Sum II

    标签: C++ 算法 LeetCode DFS 每日算法——leetcode系列 问题 Combinatio...

  • Combination Sum

    标签: C++ 算法 LeetCode 数组 DFS 每日算法——leetcode系列 问题 Combinat...

  • (原创)BFS广度优先算法,看完这篇就够了

    BFS算法 上一篇文章讲解了DFS深度优先遍历的算法,我们说 DFS 顾名思义DEEPTH FIRET,以深度为第...

网友评论

      本文标题:《算法笔记》dfs

      本文链接:https://www.haomeiwen.com/subject/aztyaqtx.html