初学者懵逼了,回溯90
  • 板块P1164 小A点菜
  • 楼主kendas
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/10/23 20:15
  • 上次更新2024/10/23 21:22:25
查看原帖
初学者懵逼了,回溯90
1428433
kendas楼主2024/10/23 20:15

感觉像回溯的模板题,然后就用回溯写,然后就超时了,数据是:

36 32 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 4 8 16

应该是太有钱然后菜太便宜导致不能剪枝,然后每个1都爆搜,直接超时。。这种有啥办法

#include <bits/stdc++.h>
using namespace std;
const int N = 105;
int d[N];
bool selected[N]{false};
int n,m;

void backtrack(int m,int d[],int &res,bool selected[],int start){
    if(m==0){res++;return;}
    if(start>=n || m<0)return;
    for(int i=start;i<n;i++){
        if(!selected[i]){
            selected[i]=true;
            backtrack(m-d[i],d,res,selected,i+1);
            selected[i]=false;
        }
    }
}

int main()
{
    cin>>n>>m;
    for(int i=0;i<n;i++)cin>>d[i];
    int res = 0;
    backtrack(m,d,res,selected,0);
    cout<<res;
}
2024/10/23 20:15
加载中...