[ZCMU OJ]5239: 砝码称重(暴力循环/map遍历)

Description

现有n个砝码,第i个砝码的重量为ai,你至多能选择三个砝码进行称重,请问对于1~w中的所有整数,有多少数字能被这n个砝码称出来?

Input

单组测试数据,第一行输入两个正整数n(1≤n≤300),w(1≤w≤1000000),第二行输入n个正整数ai(1≤ai≤1000000),含义如题所述。

Output

输出1~w能被称出来的数量。

Sample Input

4 12

3 3 3 3

Sample Output

3

HINT

对于样例,只有3,6,9这三个整数能被称出来。

3=a1

6=a1+a2

9=a1+a2+a3

注意12由于需要四个砝码才能称出,故不计入答案。

Source

C语言练习题

_____________________________________________________________________________

思路:将w范围内的砝码利用map存入wt中,再利用三重循环暴力列举在w值内可用砝码组成的重量,再次利用wt记录。最后利用迭代器遍历map,对不同重量进行计数。

#include<bits/stdc++.h>
using namespace std;
int main()
{
	ios::sync_with_stdio(false);
	
	int n,w;
	
	cin>>n>>w;
	int a[n+1];
	map<int,int>wt;//wt记录可能组成的重量 

	memset(a,0,sizeof(a));
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		if(a[i]<=w)//如果该砝码符合条件则提前存入wt 
		wt[a[i]]=1;
	}
	
	for(int i=0;i<=n;i++)
	for(int j=i+1;j<=n;j++)
	for(int k=j+1;k<=n;k++)
	if(a[i]+a[j]+a[k]<=w&&wt[a[i]+a[j]+a[k]]==0)//三重循环考虑多个砝码组成的重量 
	{
		//cout<<a[i]+a[j]+a[k]<<endl;
		wt[a[i]+a[j]+a[k]]=1;
	}
	
	map<int,int>::iterator it;//利用迭代器遍历map 
	int cnt=0;
	for(it=wt.begin();it!=wt.end();it++)
	{
		if(it->second)
		{
			//cout<<it->first<<endl;
			cnt++;
		}
	}
	cout<<cnt<<endl;
}

猜你喜欢

转载自blog.csdn.net/Solar_Zheng0817/article/details/124829374