物资调度(dfs)

来源:互联网 发布:软件测试基础 编辑:程序博客网 时间:2024/04/29 18:36

这里写图片描述

思路:很明显的一个dfs,从第一个开始,不断进行扫描,当sum = m 时就返回。代码有点丑。。

代码:

#include<iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int a[100010];int vis[100];int n,m;int sum,cnt;void dfs(int x){    if(sum>m)        return ;    if(sum==m)    {        cnt++;        return;    }    if(x == n)        return ;    for(int i=x; i<n; ++i)    {        while(i <= n-1)        {            if(!vis[i])            {                vis[i] = 1;                sum += a[i];                dfs(i+1);                vis[i] = 0;                sum -= a[i];            }            i++;        }    }}int main(){    int t;    cin >> t;    while(t--)    {        cin >> n >> m;        for(int i=0; i<n; i++)            cin >> a[i];        sum=0;        cnt=0;        memset(vis,0,sizeof(vis));        sort(a, a+n);        dfs(0);        cout << cnt << endl;    }    return 0;}
0 0