題目:
砝碼問題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;
}