题目:
砝码问题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;
}