蓝桥杯动态规划

你有一架天平和 NN 个砝码,这 NN 个砝码重量依次是 W1,W2,⋅⋅⋅,WNW1,W2,···,WN。

请你计算一共可以称出多少种不同的正整数重量?

注意砝码可以放在天平两边。

输入格式

输入的第一行包含一个整数 NN。

第二行包含 NN 个整数:W1,W2,W3,⋅⋅⋅,WNW1,W2,W3,···,WN。

输出格式

输出一个整数代表答案。

数据范围

对于 50%50% 的评测用例,1≤N≤151≤N≤15。
对于所有评测用例,1≤N≤1001≤N≤100,NN 个砝码总重不超过 105105。

输入样例:

3
1 4 6

输出样例:

10
1 = 1;
2 = 6 − 4 (天平一边放 6,另一边放 4);
3 = 4 − 1;
4 = 4;
5 = 6 − 1;
6 = 6;
7 = 1 + 6;
9 = 4 + 6 − 1;
10 = 4 + 6;
11 = 1 + 4 + 6。

 


ans=0
n=int(input())
w=[0]*(n+100)
f=[[0 for i in range(20)] for j in range(n+10)]#列需要开两倍(因为如果j+w[i]>最大可能的重量,会造成数组越界)

li=list(map(int,input().split()))
m=0#所有物品的重量
f[0][0]=1#1代表这个重量存在,0则代表不存在
for i in range(1,n+1):
    w[i]=li[i-1]
    m+=w[i]
for i in range(1,n+1):#枚举每一个砝码
    for j in range(0,m+1):#枚举每一个可能的大小,最大不会超过所有砝码的大小
        if (f[i-1][j]==1  or f[i-1][abs(j-w[i])]==1 or f[i-1][j+w[i]]==1):
            f[i][j]=1
for i in range(1,m+1):
    if (f[n][i]==1):
        ans+=1
print(ans)
print(f)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值