#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表示程序正常结束
}