几道简单ACM题的解答----7

题目:

砝码问题Problem
有一组砝码,重量互不相等,分别为m1、m2、m3……mn;它们可取的最大数量分别为x1、x2、x3……xn。 
现要用这些砝码去称物体的重量,问能称出多少种不同的重量。 

Input

第一行为一整数t,表示有t组测试数据。 

每组测试数据第一行一个整数n(n<=10),表示有多种不同的砝码; 
第二行n个整数(中间用空格分隔),m1、m2、m3……mn,分别表示n个砝码的重量;(1<=mi<=20) 
第三行n个整数(中间用空格分隔),x1、x2、x3……xn,分别表示n个砝码可取的最大数量。(1<=xi<=20) 

Output
每组数据输出仅一行,一个整数,表示利用给定的砝码可以称出的不同的重量数。 

注:包括0。 

Sample Input
1
2
1 2
2 1

Sample Output
5


我的答案:

#include<stdio.h>
#include<stdlib.h>
#define MAX 10

typedef struct linkList
{
	int sum;
	struct linkList *next;
}linkList;

int search(linkList *head,int searchNum);

int main(void)
{
	int dataGroup;
	int massNum;						//几个砝码	
	int everyNum[MAX];					//记录每种砝码的个数	
	int everyMass[MAX];					//记录每种砝码的质量
	int c;
	int i;
	int count[10];
	linkList *head;
	int length = 0;
	int sum = 0;
	//int p = 0;
	
	head = (linkList *)malloc(sizeof(linkList));
	head -> sum = -1;
	head -> next = NULL;
	scanf("%d",&dataGroup);

	for(c = 0;c < dataGroup;c++)
	{
		sum = 0;
		length = 0;
		for(i = 0;i < 10;i++)
		{
			everyMass[i] = 0;			//每种砝码的质量初始为0	
		}
		
		for(i = 0;i < 10;i++)
		{
			everyNum[i] = 0;			//每种砝码的个数初始为1	
		}
		
		scanf("%d",&massNum);
		
		for(i = 9;i > 9 - massNum;i--)
			scanf("%d",&everyMass[i]);
		for(i = 9;i > 9 - massNum;i--)
			scanf("%d",&everyNum[i]);

		// for(i = 0;i < 10;i++)
		// {
			// printf("%3d",everyMass[i]);
		// }
		
		// for(i = 0;i < 10;i++)
		// {
			// printf("%3d",everyNum[i]);
		// }
		
		for(count[0] = 0;count[0] <= everyNum[0];count[0]++)
			for(count[1] = 0;count[1] <= everyNum[1];count[1]++)
				for(count[2] = 0;count[2] <= everyNum[2];count[2]++)
					for(count[3] = 0;count[3] <= everyNum[3];count[3]++)
						for(count[4] = 0;count[4] <= everyNum[4];count[4]++)
							for(count[5] = 0;count[5] <= everyNum[5];count[5]++)
								for(count[6] = 0;count[6] <= everyNum[6];count[6]++)
									for(count[7] = 0;count[7] <= everyNum[7];count[7]++)
										for(count[8] = 0;count[8] <= everyNum[8];count[8]++)
											for(count[9] = 0;count[9] <= everyNum[9];count[9]++)
											{
												//printf("%d\n",p++);
												for(i = 0;i < 10;i++)
												{	
													sum += everyMass[i] * count[i];
													//printf("everyMass[%d] == %d and count[%d] == %d\n",i,everyMass[i],i,count[i]);
												}
												//printf("\n");
												length += search(head,sum);
												sum = 0;
											}
		printf("%d\n",length);									
	}						
}

int search(linkList *head,int searchNum)
{
	for(;(head -> next) != NULL;head = head -> next)
	{
		if(head -> next -> sum == searchNum)
			return 0;
	}
	//printf("%d\n",searchNum);
	head -> next = (linkList *)malloc(sizeof(linkList));
	head -> next -> sum = searchNum;
	head -> next -> next = NULL;
	return 1;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章