P1679 神奇的四次方数
题目描述
在你的帮助下,v神终于帮同学找到了最合适的大学,接下来就要通知同学了。在班级里负责联络网的是dm同学,于是v神便找到了dm同学,可dm同学正在忙于研究一道有趣的数学题,为了请dm出山,v神只好请你帮忙解决这道题了。
题目描述:将一个整数m分解为n个四次方数的和的形式,要求n最小。例如,m=706,706=5^4+3^4,则n=2。
输入输出格式
输入格式:
一行,一个整数m。
输出格式:
一行,一个整数n。
输入输出样例
输入样例#1: 复制
706
输出样例#1: 复制
2
说明
数据范围:对于30%的数据,m<=5000;对于100%的数据,m<=100,000
搜索??似乎不大可行、、、(因为连样例都跑不出来、、、(ORZ))
#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,ans=99999; int read() { int x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar(); return x*f; } void dfs(int tot,int s) { if(s==n) { ans=min(ans,tot); return ; } for(int i=20;i>=1;i--) if(s+pow(i,4)<=n) dfs(tot+1,s+pow(i,4)); } int main() { n=read(); dfs(0,0); printf("%d",ans); return 0; }
ZZ搜索
完全背包
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define N 101000 using namespace std; int n,m,f[N],w[20]; int read() { int x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar(); return x*f; } int main() { memset(f,127,sizeof(f)); m=read(),n=18,f[0]=0; for(int i=1;i<=n;i++) w[i]=i*i*i*i; for(int i=1;i<=n;i++) for(int j=w[i];j<=m;j++) if(f[j]>f[j-w[i]]+1) f[j]=f[j-w[i]]+1; printf("%d",f[m]); return 0; }
时间: 2024-10-03 22:38:48