全WA求助

B3624 猫粮规划

Little_Fox_Fairy @ 2023-07-13 19:16:34

这是代码

#include<bits/stdc++.h>
using namespace std;
int n,l,r,ans;
int w[41],f[41],k[41];
void dfs(int step,int tot,int start)
{
    if (tot>=l&&tot<=r) 
      ans++;
    for (int i=start;i<=n;i++)
      if (!f[i])
      {
        tot+=w[i];
        f[i]=1;
        if (tot>=l&&tot<=r)
          ans++;
        else
          dfs(step+1,tot,i+1);
        tot-=w[i];
        f[i]=0;
      }
    return ;
}
int main()
{
    ios::sync_with_stdio(0);
    cin>>n>>l>>r;
    for (int i=1;i<=n;i++)
      cin>>w[i];
    dfs(1,0,1);
    cout<<ans;
    return 0;
}

为什么会WA啊······


by weitianjian @ 2023-07-13 19:34:40

        if (tot>=l&&tot<=r)
          ans++;
        else
          dfs(step+1,tot,i+1);

此处代码逻辑有误。当前答案满足条件,有可能再继续dfs依然可以满足条件。

可以改为如下写法:

void dfs(int step,int tot,int start)
{
    if (tot>=l&&tot<=r)
        ans++;
    for (int i=start;i<=n;i++)
      {
        tot+=w[i];
        if(tot<=r)//可行性剪枝,如果当前答案已经大于r,那么后面一定不会出现新答案
        dfs(step+1,tot,i+1);
        tot-=w[i];
      }
    return ;
}

by Little_Fox_Fairy @ 2023-07-15 11:25:31

@weitianjian 噢,知道了,谢谢


|