题目大意:有n个数,w是最大极限,输入n个数,在里面抓数,可以抓1到3个数(也就是最多一次性只能抓起来3个数),使得他们之和小于等于w,问可以找到几组这样的集合。(不可有重复)
分析:遇到重复性问题一般设两个数组,可以用vector
实现方法:把小于等于w,且vec等于0的数的vec记为1,(要vec等于零:目的是防止重复),ans计数器++,同样适用于两数,三数的。
代码:
#include<bits/stdc++.h>
using namespace std;
int n, w, a[305], ans;
map <int, bool> vis;
int main() {
cin >> n >> w;
for(int i = 1; i <= n; i++) {
cin >> a[i];
if(a[i] <= w && !vis[a[i]]) {
vis[a[i]] = 1; // 记录不重复的vis等于1
ans++;
}
}
for(int i = 1; i <= n; i++) {
for(int j = i + 1; j <= n; j++) {
int sum = a[i] + a[j]; //和他后面的每一个加起来试试
if(sum <= w && !vis[sum]) { //避免重复,所以需要vis不等于1的时候
vis[sum] = 1;
ans++;
}
}
}
for(int i = 1; i <= n; 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 <= w && !vis[sum]) {
vis[sum] = 1;
ans++;
}
}
}
}
cout << ans << endl;
return 0;
}