选课时间——深搜

来源:互联网 发布:淘宝老瑞贸易可信吗 编辑:程序博客网 时间:2024/05/21 03:20

又是一道完全不一样的深搜题目,绝望ing++

http://acm.zjnu.edu.cn/CLanguage/showproblem?problem_id=1150

http://acm.hdu.edu.cn/showproblem.php?pid=2079

#include <iostream>#include <cstdio>#include <memory.h>using namespace std;int score[10];int counter;int number,n;//从 学分为 1 的课程到学分为 number 的课程依次 DFS//直到修够 n 学分,或者超出限制为止void DFS(int j, int sum)    //j 表示当前所选学分为 j 的课程{                               //sum  保存已经修的学分总数    if (sum == n)   // 注意这个 if 不能写在 下边的 if 后边 ,否则当选择最后一门课正好满足条件时会直接跳出,结果数会遗漏    {        ++counter;        return;    }    if (sum > n || j > number)        return;    if (score[j] == 0)    //  表示不存在学分为 j 的课程    {        DFS(j + 1, sum);        return;    }    for (int i = 0; i <= score[j];i ++){        DFS(j + 1, sum + i * j);        //DFS(j + 1, sum);    }}int main(){    int T, k, a, b;    scanf("%d", &T);    while (T--)    {        counter = 0;        memset(score, 0, sizeof(score));        scanf("%d %d", &n, &k);        number = 0;        while (k--)        {            scanf("%d %d", &a, &b);            score[a] = b;      //学分为 a 的课有 b 门            if (number < a)                number = a;        }        DFS(1, 0);        printf("%d\n", counter);    }    return 0;}

暴力运算,两种都可以的
#include <memory.h>#include<iostream>using namespace std;int main(){int t,n,k,a[9],sum,i,j,b,c,d[9];cin>>t;while(t--){cin>>n>>k;memset(a,0,sizeof(a));for(i=0;i<k;i++){cin>>b>>c;    a[b]+=c;}sum=0;/*从7循环到0不会超时for(d[7]=0;d[7]<=a[8];d[7]++)for(d[6]=0;d[6]<=a[7];d[6]++)for(d[5]=0;d[5]<=a[6];d[5]++)for(d[4]=0;d[4]<=a[5];d[4]++)for(d[3]=0;d[3]<=a[4];d[3]++)for(d[2]=0;d[2]<=a[3];d[2]++)for(d[1]=0;d[1]<=a[2];d[1]++)for(d[0]=0;d[0]<=a[1];d[0]++)                   /*///这样会超时,为什么?                for(d[0]=0;d[0]<=a[1];d[0]++)                for(d[1]=0;d[1]<=a[2];d[1]++)for(d[2]=0;d[2]<=a[3];d[2]++)for(d[3]=0;d[3]<=a[4];d[3]++)for(d[4]=0;d[4]<=a[5];d[4]++)for(d[5]=0;d[5]<=a[6];d[5]++)for(d[6]=0;d[6]<=a[7];d[6]++)for(d[7]=0;d[7]<=a[8];d[7]++)if(d[0]*1+d[1]*2+d[2]*3+d[3]*4+d[4]*5+d[5]*6+d[6]*7+d[7]*8==n)sum++;cout<<sum<<endl;}return 0;}
http://blog.csdn.net/qq_40513946/article/details/78797796


原创粉丝点击