【完全背包或迭代加深搜】P1679 神奇的四次方数

版权声明:转载标注来源喔~ https://blog.csdn.net/iroy33/article/details/89389371

一点点感想和启发,没给个数限制判断能否构成一个数,01背包

给了个数限制判断是否能构成一个数,多重部分和问题。 ——by iRoy33 2019/5/2

很容易想到dp[j]=min(dp[j],dp[j-i*i*i*i]+1);    一个四次方数

但是我么有想到它是完全背包,虽然说它的形式和完全背包一模一样

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e5+10;
const int INF=0x3f3f3f3f;
int dp[N];
int main()
{
    int m;
    cin>>m;
    memset(dp,INF,sizeof(dp));
    dp[0]=0;                    //以为dp[0]是1。。。
    for(int i=1;i*i*i*i<=m;++i)
        for(int j=i*i*i*i;j<=m;++j)
            dp[j]=min(dp[j],dp[j-i*i*i*i]+1);
    cout<<dp[m]<<endl;
    return 0;
}

因为在刷dp专题,所以会往这方面想,但是拿到的第一想法是迭代加深搜,遍历深度,然后dfs,先找到答案就结束

然后我试着写了一下,1A 剩余全T,太惨淡了

然后我准备去看题解了,简单扫了一下发现自己层数到达的时候,只在sum==m的时候退回,不等于m的时候没有退回,我不T谁T???_(:з」∠)_

改了之后一排绿看着心情真的好

开始后怕,10分和100分的差距o(╥﹏╥)o

int m,maxd;
int x;
int flag=0;
void dfs(int sum,int last,int layer)
{
    //cout<<maxd<<endl;
    if(flag)
        return ;
    if(layer==maxd)
    {
        if(sum==m)
        {
            flag=1;

        }
        return;             //放错位置只能拿10分!

    }
    if(sum>m) return ;
    for(int i=last;sum+i*i*i*i<=m;++i)
    {
        dfs(sum+i*i*i*i,i,layer+1);
    }
}
int main()
{
    cin>>m;
    int x=sqrt((sqrt(m)));
    for(maxd=1;;++maxd)
    {
        //cout<<maxd<<endl;
        dfs(0,1,0);             //sum=1 (选了1的时候)是第一层
        if(flag)
        {
            cout<<maxd<<endl;
            return 0;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/iroy33/article/details/89389371