天平与砝码(二)
内存限制: 256 Mb 时间限制: 1000 ms
题目描述
小爱有一座天平,还有 n n n 个砝码,这些砝码的重量分别为 w 1 , w 2 , … , w n w_1,w_2,\dots,w_{n} w1,w2,…,wn称重时,砝码与物品可以放在同一边,也可以放在不同边。当砝码与物品放在同一边时,砝码起到了减法的效果。
请计算这些砝码,能够称出多少种重量。
输入格式
第一行:单个整数表示 n n n。
第二行:nn 个整数表示 w 1 , w 2 , … , w n w_1,w_2,\dots,w_n w1,w2,…,wn
输出格式
单个整数:表示可以称量出的不同数量的重量。
数据范围
- 对于 50 50% 50 的数据, 1 ≤ n ≤ 15 1≤n≤15 1≤n≤15;
- 对于 100 100% 100 的数据, 1 ≤ n ≤ 100 1≤n≤100 1≤n≤100。
- 1 ≤ w i ≤ 100 , 000 1≤w_i≤100,000 1≤wi≤100,000;
w 1 + w 2 + ⋯ + w n ≤ 100 , 000 w_1+w_2+\dots+w_n\leq 100,000 w1+w2+⋯+wn≤100,000
样例数据
输入:
3
1 4 10
输出:
12
说明:
能称出的12种重量是:1、3、4、5、6、7、9、10、11、13、14、15
算法分析
正负背包DP递推求解。
#include <iostream>
using namespace std;
const int N = 110, M = 200010, B = M / 2;
int n, m, ans = 0, w[N];
bool f[N][M];
int main()
{
cin >> n;
for (int i = 1; i <= n; ++i)
cin >> w[i], m += w[i];
f[0][B