用深搜解决P1043
经过本蒟蒻无数次的提交,我用深搜 AC 这道题了!
解题思路
我们可以把写
这个程序虽然会超时,但是只有第
#include<bits/stdc++.h>
using namespace std;
int n,m,a[51],sum[10],ans_max=INT_MIN,ans_min=INT_MAX;
bool flag[10];
int mod10(int x)
{
return ((x%10)+10)%10;
}
void dfs1(int id,int last)
{
int ans=1;
for(int i=1;i<=m;i++)
{
if(flag[i])
{
ans*=mod10(sum[i]);
}
}
if(id==n+1)
{
if(sum[m]!=0)
ans_min=min(ans_min,ans);
return;
}
if(id==1)
{
flag[1]=true;
sum[1]=a[1];
dfs1(2,1);
}
else
{
sum[last]+=a[id];
dfs1(id+1,last);
sum[last]-=a[id];
if((last+1)<=m)
{
sum[last+1]+=a[id];
flag[last+1]=true;
dfs1(id+1,last+1);
sum[last+1]-=a[id];
flag[last+1]=false;
}
if(id==n)
{
sum[1]+=a[n];
dfs1(n+1,1);
sum[1]-=a[n];
}
}
}
void dfs2(int id,int last)
{
int ans=1;
for(int i=1;i<=m;i++)
{
if(flag[i])
{
ans*=mod10(sum[i]);
}
}
if(id==n+1)
{
if(sum[m]!=0)
ans_max=max(ans_max,ans);
return;
}
if(id==1)
{
flag[1]=true;
sum[1]=a[1];
dfs2(2,1);
}
else
{
sum[last]+=a[id];
dfs2(id+1,last);
sum[last]-=a[id];
if((last+1)<=m)
{
sum[last+1]+=a[id];
flag[last+1]=true;
dfs2(id+1,last+1);
sum[last+1]-=a[id];
flag[last+1]=false;
}
if(id==n)
{
sum[1]+=a[n];
dfs2(n+1,1);
sum[1]-=a[n];
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
dfs1(1,0);
for(int i=1;i<=m;i++)
{
sum[i]=0;
flag[i]=false;
}
dfs2(1,0);
printf("%d\n%d",ans_min,ans_max);
return 0;
}
最优性剪枝:求最大值时,如果当前的最优可能,也不如