一直超时,也没有输出问题,请问怎么改?
#include<stdio.h>int main()
{
int i,t,a,b,c,d,e,j,min,max,m,n,p,q,g,q1,g1;
scanf("%d",&t);
for(i=0;i<t;i++)
{
int num=0,sum=0,sum1=0,sum2=0;
scanf("%d %d %d %d %d",&a,&b,&c,&d,&e);
int A,B,C,D,E;
for(j=0;j<a;j++)
scanf("%d",&A);
for(j=0;j<b;j++)
scanf("%d",&B);
for(j=0;j<c;j++)
scanf("%d",&C);
for(j=0;j<d;j++)
scanf("%d",&D);
for(j=0;j<e;j++)
scanf("%d",&E);
scanf("%d %d",&min,&max);
for(q=0;q<d;q++)
{
for(q1=0;q1<d;q++)
{
if(q==q1) sum1=D;
else sum1=D+D;
for(g=0;g<e;g++)
{
for(g1=0;g1<e;g++)
{
if(g==g+1) sum2=E;
else sum2=E+E;
for(m=0;m<a;m++)
{
for(n=0;n<b;n++)
{
sum=0;
sum=sum1+sum2+A+B;
if(sum>=min&&sum<=max) num++;
}
}
for(p=0;p<c;p++)
{
sum=0;
sum=sum1+sum2+C;
if(sum2>=min&&sum2<=max) num++;
}
}
}
}
}
printf("%d\n",num);
}
return 0;
}
在学校餐厅,有 a 种汤,b 种饭,c 种面条,d 种荤菜,e 种素菜。为了保证膳食搭配,小王每顿饭都会点 1~2 样荤菜,1~2 样素菜(不重复)。同时,在小王心情好的时候,会点一样饭,再配上一种汤。在心情不好的时候,就只吃一种面条。因为经济有限,小王每次点餐的总价在 min~max 之间。小王想知道,总共有多少种不同的点餐方案。
输入描述
输入数据第一行包含一个整数 T,表示测试数据的组数,对于每组测试数据: 第一行为整数 a,b,c,d,e (0<a,b,c,d,e<=10) 第二行为 a 个大于零的整数,表示 a 种汤的价格 第三行为 b 个大于零的整数,表示 b 种饭的价格 第四行为 c 个大于零的整数,表示 c 种面条的价格 第五行为 d 个大于零的整数,表示 d 种荤菜的价格 第六行为 e 个大于零的整数,表示 e 种素菜的价格 第七行为两个整数 min max, 表示每次点餐的价格范围
输出描述
对于每组测试数据,输出一行,包含一个整数,表示点餐方案数。
样例输入
Copy to Clipboard
1
2 2 2 2 2
2 3
3 1
5 2
1 4
3 6
5 8
样例输出
Copy to Clipboard
3 本帖最后由 jhq999 于 2022-4-22 16:04 编辑
用了最笨的方法拆解
#include<stdio.h>
void su(int **cai,int *caicount,int sum,int min,int max,int *count)
{
int s={sum,sum};
for (int i = 0; i < caicount; i++)
{
sum=s;
sum+=cai;
if (sum>max)continue;
if(sum>=min)
{
(*count)++;
}
s=sum;
for (int j = 0; j < caicount; j++)
{
if (i!=j)
{
sum=s;
sum+=cai;
if (sum>max)continue;
if(sum>=min)
{
(*count)++;
}
}
}
}
}
void hun(int **cai,int *caicount,int sum,int min,int max,int *count)
{
int h={sum,sum};
for (int i = 0; i < caicount; i++)
{
sum=h;
sum+=cai;
if (sum>max)continue;
h=sum;
su(cai,caicount,sum,min,max,count);
for (int j = 0; j < caicount; j++)
{
if (i!=j)
{
sum=h;
sum+=cai;
if (sum>max)continue;
su(cai,caicount,sum,min,max,count);
}
}
}
}
void tangandmifan(int **cai,int *caicount,int sum,int min,int max,int *count)
{
for (int i= 0; i < caicount; i++)
{
for (int j = 0;j < caicount;j++)
{
sum=0;
sum+=cai+cai;
if (sum>max)continue;
hun(cai,caicount,sum,min,max,count);
}
}
}
int main()
{
int i,t,a,b,c,d,e,j,min,max,m,n,p,q,g,q1,g1;
scanf("%d",&t);
int num=0,sum=0,count=0;
scanf("%d %d %d %d %d",&a,&b,&c,&d,&e);
int *A=new int,*B=new int,*C=new int,*D=new int,*E=new int,*cai={A,B,C,D,E},caicount={a,b,c,d,e};
for(j=0;j<a;j++)
scanf("%d",&A);
for(j=0;j<b;j++)
scanf("%d",&B);
for(j=0;j<c;j++)
scanf("%d",&C);
for(j=0;j<d;j++)
scanf("%d",&D);
for(j=0;j<e;j++)
scanf("%d",&E);
scanf("%d %d",&min,&max);
tangandmifan(cai,caicount,sum,min,max,&count);
for (i = 0; i < caicount; i++)
{
sum=cai;
if (sum>max)continue;
hun(cai,caicount,sum,min,max,&count);
}
printf("%d",count);
for (i = 0; i < 5; i++)
{
delete[] cai;
}
return 0;
}
页:
[1]