【1103】Integer Factorization (30分)【DFS】

简介: 【1103】Integer Factorization (30分)【DFS】【1103】Integer Factorization (30分)【DFS】
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>  
#include<map>
#include<vector>
#include<queue> 
using namespace std;  
//DFS,注意生成分支:是否选择index
int n,k,p,maxFacSum=-1;//n=k个(数i^p)
vector<int> v,ans,tempAns;
//ans数组存储因子的序列,tempAns为当前DFS来的序列,init把i从0开始所有的i的p次方的值存储在v[i]中
void init(){
  int temp=0,index=1;
  while(temp <=n){
    v.push_back(temp);
    temp=pow(index,p);
    index++;
  }
}
/*    
index为当前正相加的v[i]的i
tempSum当前的总和
tempK当前K的总个数
facSum为当前因子和
*/
void dfs(int index,int tempSum,int tempK,int facSum){
  if(tempK==k&&tempSum==n){ //有结果
    if(facSum >maxFacSum){ //剪枝1
      ans=tempAns;
      maxFacSum=facSum;//更新当前的因子和
    }
    return;
  }
  if(tempK>k || tempSum>n)  return;//无结果
  if(index >= 1){ //生成分支
    tempAns.push_back(index);//选择index
    dfs(index,tempSum+v[index],tempK+1,facSum+index);
    tempAns.pop_back();
    dfs(index-1,tempSum,tempK,facSum);//不选择index
  }
}
/*剪枝:
1.  tempK==K但是tempSum!=n的时候需要剪枝
2.  在枚举的时候,按顺序枚举,上界或者下界可进行剪枝
*/
int main(){   
  scanf("%d%d%d",&n,&k,&p);
  init();
  dfs(v.size()-1 ,0,0,0);
  //从v[i]末尾往前遍历,保证ans和tempAns数组保存的是从大到小的因子的顺序
  if(maxFacSum == -1) {
    printf("Impossible");
    return 0;
  }//开始maxFacSum == -1,如果dfs后maxFacSum仍为-1,则输出Impossible,否则输出答案
  printf("%d = ",n);
  for(int i=0;i<ans.size();i++) {
    if( i != 0) printf(" + ");//细节
    printf("%d^%d",ans[i],p);  
  }  
  system("pause");
    return 0;   
}
相关文章
Biggest Number (DFS+剪枝)
Biggest Number (DFS+剪枝)
44 0
|
机器学习/深度学习
CF1552A Subsequence Permutation(string排序大法)
CF1552A Subsequence Permutation(string排序大法)
41 0
LeetCode 167 Two Sum II - Input array is sorted(输入已排序数组,求其中两个数的和等于给定的数)
给定一个有序数组和一个目标值 找出数组中两个成员,两者之和为目标值,并顺序输出
93 0
codeforces1244——D.Paint the Tree(dfs)
codeforces1244——D.Paint the Tree(dfs)
89 0
CF1181B.Split a Number(贪心+高精度)
CF1181B.Split a Number(贪心+高精度)
100 0
L2-016 愿天下有情人都是失散多年的兄妹 (25 分)(dfs)
L2-016 愿天下有情人都是失散多年的兄妹 (25 分)(dfs)
130 0
|
测试技术
7-37 整数分解为若干项之和 (20 分)(dfs)
7-37 整数分解为若干项之和 (20 分)(dfs)
264 0
LeetCode 2049. 统计最高分的节点数目(DFS)
LeetCode 2049. 统计最高分的节点数目(DFS)
132 0
LeetCode 2049. 统计最高分的节点数目(DFS)
【1103】Integer Factorization (DFS)
(1)开一个vector数组fac存0^ p ,1^ p… i ^ p. (2)DFS: 分叉口:利用DFS对fac[index]进行选择,有“选”与“不选”两种选择,如果不选,则把问题转化为对fac[index]进行选择;如果选择,由于每个数字可以重复选择即下一次还能选择fac[index]。 递归边界:2个return,第一个满足sum == N且nowK==
122 0