幾道簡單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;
}


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