题目描述
有 n 个数,最多选 3 个,总和正好凑到 w 及以下的有几组。
输入
N W
A1 A2 … An
输出
答案
样例输入
#1 2 10 1 3 #2 2 1 2 3 #3 7 251 202 20 5 1 4 2 100
样例输出
#1 3 #2 0 #3 48
数据范围限制
1 ≤ N ≤ 300
1 ≤ W ≤ 1e6
1 ≤ Ai ≤ 1e6
这道题,就一点一点得去全枚举,找出所有可能,进行判断
上AC代码:
#include<bits/stdc++.h>
using namespace std;
int a[301],bz[1000001];
int main()
{
int n,m,cnt=0;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
int sum=a[i];
if(sum<=m) bz[sum]=1;
}
for(int i=1;i<=n-1;i++)
{
for(int j=i+1;j<=n;j++)
{
int sum=a[i]+a[j];
if(sum<=m)
bz[sum]=1;
}
}
for(int i=1;i<=n-1;i++)
{
for(int j=i+1;j<=n;j++)
{
for(int k=j+1;k<=n;k++)
{
int sum=a[i]+a[j]+a[k];
if(sum<=m)
bz[sum]=1;
}
}
}
for(int i=1;i<=m;i++)
{
if(bz[i]!=0)
cnt++;
}
cout<<cnt;
}
看到这,那你是不是会疑惑,这时间复杂度不直接时间超限了吗?其实这些测试点 都不恐怖恶心。要说最恶心的就是在2015年中山市小学信息学竞赛中的《合法方案》这道题,用着方法,做多只有70分,剩下30分,直接TLE了