题解分享
题解分享简介
砝码称重(编程题) - 题解
像方案数,种类数啥的一般都是dp,转移方程想不出,那就用暴搜,刚才自己用暴搜做,结果全错了,原因是在出口处的处理上,实际对于每次搜索,用一个bool数组去记录重量状态即可,最后遍历所有数,标记过的计数
```
#include<bits/stdc++.h>
using namespace std;
int n,a[105],ans;
bool st[100005];
void dfs(int x,int y,int u)
{
if(u==n+1)return;
st[abs(x-y)]=1;
dfs(x+a[u],y,u+1);
dfs(x,y+a[u],u+1);
dfs(x,y,u+1);
}
int main()
{
cin>>n;//天平有两边
for(int i=0;i<n;i++)cin>>a[i];
//单独一边 共Cni[1,n]求和
//分别两边
dfs(0,0,0);
for(int i=1;i<=100005;i++)
if(st[i])ans++;
cout<<ans;
return 0;
}
```
查看全文
0
0
2
1
砝码称重(编程题) - 题解
#include
#include
#include
#include
using namespace std;
int N;
int w;
set
s;
int main() {
cin >> N;
for (int i = 1; i
> w;
vector
v(s.begin(), s.end());
for (int j = 0; j < v.size(); j++) {
s.insert(w + v[j]);
if ( abs(w - v[j]) != 0 )
s.insert(abs(w - v[j]));
}
s.insert(w);
}
cout << s.size() << endl;
return 0;}
查看全文
0
0
1
0
砝码称重(编程题) - 题解
```
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110, M = 200010, B = M/2;
int a[N];
int n, m;
bool f[N][M];//从前i个砝码中选,重量为j的方案数
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ )
{
cin >> a[i];
m += a[i];
}
f[0][B] = true;
for (int i = 1; i <= n; i ++ )
for (int j = -m; j <= m; j ++ )
{
f[i][j + B] = f[i - 1][j + B];
if(j - a[i] >= -m) f[i][j + B] |= f[i - 1][j - a[i] + B];
if(j + a[i] <= m) f[i][j + B] |= f[i - 1][j + a[i] + B];
}
int res = 0;
for (int j = 1; j <= m; j ++ )
if(f[n][j + B] == true)
res ++;
cout << res;
return 0;
}
```
查看全文
0
0
1
0



