poj1010 dfs

首先说这道题的题意确实吓着我了,然后就是看到自己写的满是漏洞的程序我就哎,啥也不说了!

大致题意:

给出一些邮票的价值,其中有些邮票的价值相等但是是不同种类的,然后给出顾客对邮票总价值的需求,其中,顾客最多能买四张邮票,如果有多种情况,则取种类最多的那种,如果种类相同则取数量最小的那种,如果数量还相同则取其中邮票价值最大的那种,如果最大值还相等,则输出tie,如果没有满足顾客的组合,则输出noon,题意大致就这样,我是看了别人的翻译很久才懂的!

思路:这道题因为数据少,其实是可以采用暴力的做法的,不过我用的是深搜,但是那个漏洞百出啊,最大的漏洞就是对tie的标记,当两种组合方法使得邮票的类型,数量以及最大值都相同的时候我就直接标记tie并且跳出循环了,其实可以有比这种做法的类型更多或者数量更少或者最大值更大的解,此时跳出循环是错的,我是找了测试数据才发现的啊!一晚上啊!

下面是代码啦!

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int value[100],customer[1000],n,m;
typedef struct fun
{
	int type,amout,Max;
	int sign;
	int t[5];
}rr;
fun a[100];
int q[5];
int cmp(const void *a,const void *b)
{
    return *(int *)a-*(int *)b;
}
void dfs(int i,int s,int sum,int type,int amout,int Max,int p)
{
	int j;
	if(sum==s)//已经拼满了
	{
		if(type>a[i].type)
		{
			a[i].sign=0;
		    a[i].type=type;a[i].amout=amout;a[i].Max=Max;
			for(j=1; j<=a[i].amout; j++)
				a[i].t[j]=q[j];
		}
		else if(type==a[i].type)
		{
			if(amout<a[i].amout)
			{
				a[i].sign=0;
				a[i].type=type;a[i].amout=amout;a[i].Max=Max;
				for(j=1; j<=a[i].amout; j++)
				a[i].t[j]=q[j];
			}
			else if(amout==a[i].amout)
			{
				if(Max>a[i].Max)
				{
					a[i].sign=0;
                   a[i].type=type;a[i].amout=amout;a[i].Max=Max;
				  for(j=1; j<=a[i].amout; j++)
				   a[i].t[j]=q[j];
				}
				else if(Max==a[i].Max)
				{
					a[i].sign=1; 
				}
			}
		}
		return ;
	}
	if(amout==4)//总的已经有四个了
		return ;
	int e;
    for(j=p; j<n; j++)
	{
		if(sum+value[j]>s)//已经放不下了
		{
			return ;
		}
		if(j==p && type!=0)
		{
			e=q[amout+1];
			q[amout+1]=value[j];
			dfs(i,s,sum+value[j],type,amout+1,Max>value[j]?Max:value[j],j);
			q[amout+1]=e;
		}
		else
		{
			e=q[amout+1];
			q[amout+1]=value[j];
			dfs(i,s,sum+value[j],type+1,amout+1,Max>value[j]?Max:value[j],j);
			q[amout+1]=e;
		}
	}
}
int main()
{
	int i,j; 
	while(scanf("%d",&value[0])!=EOF)
	{
         i=1;
		 while(scanf("%d",&value[i]))
		 {
			 if(value[i]==0)
				 break;
			 i++;
		 }
		 n=i;
		 i=0;
		 while(scanf("%d",&customer[i]))
		 {
			 if(customer[i]==0)
				 break;
			 i++;
		 }
		 m=i;//顾客的人数
		 qsort(value,n,sizeof(int),cmp);//对价值进行升序排列的 
 
		 for(i=0; i<m; i++)
		 {
			 a[i].amout=INT_MAX;a[i].Max=0;a[i].type=0;
			 a[i].sign=0; 
			 dfs(i,customer[i],0,0,0,0,0); 
			 if(a[i].sign==1)
			    printf("%d (%d): tie\n",customer[i],a[i].type);
			 else if(a[i].amout==INT_MAX && a[i].Max==0 && a[i].type==0)
			 {
				 printf("%d ---- none\n",customer[i]);
			 }
			 else
			 {
				 printf("%d (%d):",customer[i],a[i].type);
				 for(j=1; j<=a[i].amout; j++)
					 printf(" %d",a[i].t[j]);
				 printf("\n");
			 }
		 }
	}
	return 0;
}


 

你可能感兴趣的:(poj1010 dfs)