砝码称重【第十二届蓝桥杯研究生组(CC++)】

砝码称重【第十二届蓝桥杯研究生组(CC++)】,第1张


分析:
此题为dp题,不过这里我还没学dp,所以打算才用迭代或者dfs来暴力骗分。


迭代

加入有1 4 6三种砝码,称出的重量如下:

  1. 假设只有1这个砝码:
    1:只有1的重量
  2. 加上4这个砝码:
    4:只有4的重量
    5:在重量1的同一侧放4
    3:在重量1的另一侧放4
  3. 加上6这个砝码:
    6:只有6的重量
    7:在重量1的同一侧放6
    5:在重量1的另一侧放6 (去重)
    10:在重量4的同一侧放6
    2:在重量4的另一侧放6
    11:在重量5的同一侧放6
    1:在重量5的另一侧放6 (去重)
    9:在重量3的同一侧放6
    6:在重量3的另一侧放6 (去重)


由图,迭代在蓝桥杯官网通过,dfs得40分

#include
#include
//#include
#include
using namespace std;
const int N = 100;
set<int> s;
int w[N];
int main()
{
	
	int n;
	cin >> n;
	for(int i = 0; i < n; i++)
	{
		scanf("%d", &w[i]);
	}
	s.insert(w[0]);
	for(int i = 1; i < n; i++)
	{
		set<int> temp;
		temp.insert(w[i]);
		for(auto a : s)
		{
			temp.insert(a + w[i]);
			if((a - w[i]) != 0)
				temp.insert(fabs(a - w[i]));
		}
		s.insert(temp.begin(), temp.end());
	}
	cout << s.size(); 
	return 0;
}

迭代在一个网站通过了,在另一个网站得了84分

dfs

dfs就是遍历每一个砝码,分三种情况,分别是加在同一侧,加在另一侧,不加,最后在加入的时候将负数变为正数

#include
#include
#include
using namespace std;
const int N = 100;
int w[N];
int st[N];
int sum;
int n;
set<int> s;
void dfs(int i)
{
	if(i == n + 1)
	{
		if(sum != 0)
		{
			
			s.insert(fabs(sum));
		}
		return;
	}
	sum += w[i];
	dfs(i + 1);
	sum -= w[i];
	
	sum -= w[i];
	dfs(i + 1);
	sum += w[i];
	
	dfs(i + 1);
}

int main()
{

	cin >> n;

	for(int i = 1; i <= n; i++)
	{
		scanf("%d", &w[i]);
	}
	
	dfs(0);
	cout << s.size();
	return 0;
}

这个在一个平台AC了40%,然后超时,在另一个平台36分,然后超时。


结果


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/577691.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-11
下一篇 2022-04-11

发表评论

登录后才能评论

评论列表(0条)

保存