(一)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);
}
}