动态规划,一个一个加
人为构造的map表需要开的很大才能不会越界
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int WeightMap[1000000] = {0};
int Sum[100000] = {0};
int main()
{
int n,i,k;
int weight[11];
int num[11];
scanf("%d\n", &n);
//输入
for(i=0; i<n; i++)
{
scanf("%d\n", &weight[i]);
}
for(i=0; i<n; i++)
{
scanf("%d\n", &num[i]);
}
//初始化第一个元素
Sum[0] = weight[0];
num[0]--;
WeightMap[Sum[0]] = 1;
int count = 1;
int last_count = 1;
//每种重量
for(i=0; i<n; i++)
{
k = 0;
//每种重量的数目
for(;num[i] > 0; num[i]--)
{
if(WeightMap[weight[i]] != 1)
{
WeightMap[weight[i]] = 1;
Sum[count++] = weight[i];
}
//上一次不重复的所有元素
for(;k<last_count; k++)
{
if(WeightMap[Sum[k] + weight[i]] != 1)
{
WeightMap[Sum[k] + weight[i]] = 1;
Sum[count++] = Sum[k] + weight[i];
}
}
last_count = count;
}
}
printf("%d\n", (count+1));
return 0;
}