小雨初晴 题解分享 · 2024/4/7
砝码称重(编程题) - 题解
像方案数,种类数啥的一般都是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
less 题解分享 · 2024/4/11
砝码称重(编程题) - 题解
#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
Dervish 题解分享 · 2024/4/9
砝码称重(编程题) - 题解
``` #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