描述
现有一组砝码,重量互不相等,分别为m1,m2,m3…mn;
每种砝码对应的数量为x1,x2,x3...xn。现在要用这些砝码去称物体的重量(放在同一侧),问能称出多少种不同的重量。
注:
称重重量包括0
输入描述:
输入包含多组测试数据。
对于每组测试数据:
第一行:n --- 砝码数(范围[1,10])
第二行:m1 m2 m3 ... mn --- 每个砝码的重量(范围[1,2000])
第三行:x1 x2 x3 .... xn --- 每个砝码的数量(范围[1,6])
输出描述:
利用给定的砝码可以称出的不同的重量数
示例1
输入:
2
1 2
2 1
输出:
5
#include <stdio.h>
#include <malloc.h>
int main(void)
{
int cnt;
int *weight;
int *num;
int i, j, k;
int total;
char *map;
while(scanf("%d", &cnt) != EOF)
{
total = 1;
weight = (int* )calloc(cnt, sizeof(int));
num = (int *)calloc(cnt, sizeof(int));
for(i=0; i<cnt; i++)
{
scanf("%d", weight+i);
}
for(i=0; i<cnt; i++)
{
scanf("%d", num+i);
total = total+(*(num+i))*weight[i];
}
map = (char* )calloc(total, sizeof(char));
map[0] = 1;
for(i=0; i<cnt; i++)
{
for(j=0; j<num[i]; j++)
{
// 从后往前,否则前面的可能会污染后面的
for(k=total-1; k>=0; k--)
{
if(map[k])
{
map[k+weight[i]] = 1;
}
}
}
}
j = 0;
for(i=0; i<total; i++)
{
j = j+map[i];
}
printf("%d\n", j);
free(map);
free(weight);
free(num);
}
return 0;
}
集合去重的思想
倒叙规避污染
1万+

被折叠的 条评论
为什么被折叠?



