蓝桥杯 砝码称重【第十二届】【动态规划】以及一些总结

写在前面:没有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.空容器的首迭代器等同于尾后迭代器

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值