几道简单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;
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值