分析:
此题为dp题,不过这里我还没学dp,所以打算才用迭代或者dfs来暴力骗分。
加入有1 4 6三种砝码,称出的重量如下:
- 假设只有1这个砝码:
1:只有1的重量 - 加上4这个砝码:
4:只有4的重量
5:在重量1的同一侧放4
3:在重量1的另一侧放4 - 加上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分
dfsdfs就是遍历每一个砝码,分三种情况,分别是加在同一侧,加在另一侧,不加,最后在加入的时候将负数变为正数
#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分,然后超时。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)