写在前面:没有ac,只过了80%样例,我的dp并不是这道题的最优dp算法!先这样骗点分吧,dp在学了,在学了(
思路:每次加入一个砝码a,让a与a之前产生的所有值进行加减运算以产生新值(记得考虑a本身),将新值保存至一个容器,最后计算容器中值的数目。
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int main(void)
{
vector<int> weight(100000, 0);
int n, temp, count = 0;
vector<int>::iterator it, it1, it2 = weight.begin();//it1是子结构范围的右开区间(temp只需要和该范围元素进行"+"and"-"),it2是当前可添加元素位置,同时是查找范围的右开区间。
cin >> n;
for (int i = 0; i != n; ++i)
{
it1 = it2;//每次循环必须更新子结构范围
cin >> temp;
if (find(weight.begin(), it2, temp) == it2)
*it2++ = temp;//添加元素后必须更新可添加元素位置
for (it = weight.begin(); it != it1; ++it)
if (find(weight.begin(), it2, temp + *it) == it2)
*it2++ = temp + *it;//添加元素并更新可添加元素位置
for (it = weight.begin(); it != it1; ++it)
if (find(weight.begin(), it2, abs(temp - *it)) == it2)
*it2++ = abs(temp - *it);//添加元素并更新可添加元素位置
}
for (it = weight.begin(); it != weight.end(); ++it)
if (*it != 0)
++count;
cout << count;
return 0;
}
总结:
1.如果对空容器取begin()和end(),并随后push_back(),vector将“重新”分配内存,导致迭代器失效,故本题不能用空容器储存值!也许内置数组是一个更好的选择!
2.空容器的首迭代器等同于尾后迭代器