洛谷——P1679 神奇的四次方數
阿新 • • 發佈:2017-11-19
while reg copy get mem 描述 不出 define string
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==‘-ZZ搜索‘)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; }
完全背包
#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; }
洛谷——P1679 神奇的四次方數