动态规划,一个一个加

人为构造的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;
}