DFS---深度优先搜索

(一)DFS思路详解

类似于走迷宫的题目,我们先给定一个规则(例如碰到岔路就向右走)如果遇到死路 我们就返回上一个路口并选择其他方向 一直到走完所有地方
例题
有n件物品,每件物品重量w[i],价值c[i],现在需要选择若干件物品放到容量为V的背包中,使选入背包的物品重量不超过V的前提下,使得背包得价值最大,求最大价值

#include<iostream>
const int maxn = 30;
int n,v,maxValue = 0;
int w[maxn],c[maxn];
void dfs(int index,int sumW,int sumC)
{
   if( index == n)
       return; //完成n件物品选择
   dfs(index+1,sumW,sumC);不选第index件物品
   if(sumW + w[index] <= v)//容量未超过才能继续 剪枝
   {
       if(sumC + c[index] > maxValue)
       maxnValue = sumC + c[index];
   dfs(index + 1,sumW + w[index],sumC +c[index]);
   }
}

(二)dfs题目

1103 Integer Factorization (30分)

#include<iostream>
#include<vector>
using namespace std;
int n,k,p,maxfacsum = -1;
vector<int> fac,ans,temp;//fac 存放小于n的k[i]^p
//ans存放最终结果
int power(int x)
{
  int ans = 1;
  for(int i = 0;i<p;i++)
    ans *= x;
  return ans;
}//获得k[i]^p 不能用pow 
void init()
{
  int i = 0,temp =0 ;
  while(temp <= n)
  {
    fac.push_back(temp);
    temp = power(++i);
  }
}//初始化
void dfs(int index,int nowk,int sum , int facsum)
{
  if(sum == n && nowk == k)//满足和相等且个数相等
  {
    if(facsum > maxfacsum)
    {
      ans = temp;
      maxfacsum = facsum;
    }
  }
  if(sum > n || nowk > k)//有一项不满足就剪枝
  return;
  if(index - 1 >=0)
  {
    temp.push_back(index);
    //选第index个元素 
    dfs(index,nowk +1,sum+fac[index],facsum + index);
    temp.pop_back();
    //记得pop出上一轮push的元素
    //不选这个数 进入下一个数
    dfs(index-1,nowk,sum,facsum);
  }
}
int main()
{
  scanf("%d%d%d",&n,&k,&p);
  init();
  dfs(fac.size()-1,0,0,0);
  if(maxfacsum == -1)
    printf("Impossible\n");
  else
  {
    printf("%d = %d^%d",n,ans[0],p);
    for(int i = 1; i <ans.size();i++)
      printf(" + %d^%d",ans[i],p);
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值