给定一个数S,找任意个正整数a1,a2,…,an,使得它们的和恰好等于S,且它们的倒数之和与1的差不超过10^-6。
输出任意一种方案或者输出无解。 S<=65536 解析: 事实上也是简单的搜索。 从小到大枚举每个数,加入试试看。 两个剪枝: ①当前的和加上最大的和到不了1,退出。 ②当前的和加上最小的和都超过了1,退出。 代码:#include#include #include #include #define eps 1e-6 using namespace std;int s,a[65537],cnt;void dfs(int left,double sum){ if(left){ if(sum+1.0/left>1+eps) return; if(sum+1.0/(a[cnt])*(left/(double)a[cnt])<1-eps) return;}//剪枝 if(left==0){ if(sum>1.0+eps||sum<1.0-eps) return; else { //printf("%.6lf\n",sum); for(int i=1;i<=cnt;i++) printf("%d ",a[i]); exit(0); } } for(int i=a[cnt];i<=left;i++) { a[++cnt]=i; dfs(left-i,sum+1.0/i); cnt--; } }int main(){ scanf("%d",&s); dfs(s,0); return 0;}