一点点感想和启发,没给个数限制判断能否构成一个数,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;
}
}
}