非常难的一道深度搜索题目需要解决

#include<bits/stdc++>
using namespace std;
int main(){
    //使用卡牌:分批读取数组
    int T;
    int n,m,v;
    int HP[i];
    //判断炉石传说的目的
    scanf("%d",);
    
    
}
#include <cstdio>
#include <cstring>

int n, m, max;
int f[11], d[11], p[11], v[11], h[11];
void dfs ( int x, int y, int num )
{
    if ( num > max )
        max = num;

    if ( max == n )
        return;

    int i, j;
    for ( i=x ; i <= m ; i++ )
    {
        for ( j=1 ; j <= n ; j++ )
        {
            if ( d[i] >= f[j] && p[i] <= y && v[i] && h[j] )
            {
                v[i] = h[j] = 0;
                dfs (i, y - p[i], num + 1);
                v[i] = h[j] = 1;
            }
        }
    }
}

int main ()
{
    int i, k;
    int y;

    scanf ("%d", &k);
    while ( k -- )
    {
        scanf ("%d %d %d", &n, &m, &y);
        for ( i=1 ; i <= n ; i++ )
            scanf ("%d", &f[i]);

        for ( i=1 ; i <= m ; i++ )
            scanf ("%d %d", &d[i], &p[i]);

        max = 0;
        memset (v, -1, sizeof (v));
        memset (h, -1, sizeof (h));
        dfs (1, y, 0);
        printf ("%d\n", max);
    }
    return 0;
}

这是我完善程序之后的代码:
 

#include <cstdio>   // 引入标准输入输出库  
#include <cstring>  // 引入字符串处理库  
  
// 定义全局变量  
int n, m, max;       // n和m可能是集合的大小,max用于存储最大值  
int f[11], d[11], p[11], v[11], h[11]; // 五个长度为11的数组,分别表示五个不同的事物  
  
// 定义深度优先搜索函数  
void dfs(int x, int y, int num) {  
    // 如果找到更大的数量,更新最大值  
    if (num > max) {  
        max = num;  
    }  
      
    // 如果最大值等于n,则结束搜索  
    if (max == n) {  
        return;  
    }  
      
    int i, j; // 循环变量  
    for (i = x; i <= m; i++) { // 遍历集合d  
        for (j = 1; j <= n; j++) { // 遍历集合f  
            // 检查当前元素是否满足条件  
            if (d[i] >= f[j] && p[i] <= y && v[i] && h[j]) {  
                // 如果满足条件,则暂时禁用这两个元素,然后递归搜索  
                v[i] = h[j] = 0;  
                dfs(i, y - p[i], num + 1);  
                // 回溯,恢复元素的原始状态  
                v[i] = h[j] = 1;  
            }  
        }  
    }  
}  
  
// 主函数  
int main() {  
    int i, k; // 循环变量和测试用例数量  
    int y;    // 可能是已使用的资源数量  
      
    // 读取测试用例数量k  
    scanf("%d", &k);  
    while (k--) { // 处理每个测试用例  
        // 读取n、m和y的值  
        scanf("%d %d %d", &n, &m, &y);  
        // 读取集合f的元素值  
        for (i = 1; i <= n; i++) {  
            scanf("%d", &f[i]);  
        }  
        // 读取集合d的元素值和限制条件p的值  
        for (i = 1; i <= m; i++) {  
            scanf("%d %d", &d[i], &p[i]);  
        }  
        max = 0; // 初始化最大值为0  
        memset(v, -1, sizeof(v)); // 将数组v初始化为-1(可能是为了标记数组中的元素已被访问过)  
        memset(h, -1, sizeof(h)); // 将数组h初始化为-1(可能是为了标记数组中的元素已被访问过)  
        dfs(1, y, 0); // 从第一个元素开始搜索,y是已使用的资源数量,0是初始的满足条件的元素数量  
        printf("%d\n", max); // 输出最大值  
    }  
    return 0; // 主函数结束,返回0表示程序正常结束  
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值