HDU 5616 Jam's balance(暴力枚举子集)
Posted AC_Arthur
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 5616 Jam's balance(暴力枚举子集)相关的知识,希望对你有一定的参考价值。
题目链接:点击打开链接
题意:有一个没有游标的天平,和n个秤砣,m个询问, 每次一个k,问可否秤出k这个重量。 秤砣可以放两边。
思路:因为n最大20, 暴力枚举子集。 因为可以放两边, 所以每次再跑一遍, 减去每个的重量, 将答案保存。
比赛的时候忘了限制边界,虽然过了终测数据, 却被人用大数据hack了(RE), 还是自己程序写的不够鲁棒, 思考的不完善。
细节参见代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) using namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; const int mod = 1000000000 + 7; const int INF = 1000000000; const int maxn = 100; int T,n,m,k,kase=0,a[maxn],vis[30000+10]; int main() { scanf("%d",&T); memset(vis, 0, sizeof(vis)); while(T--) { scanf("%d",&n); ++kase; for(int i=0;i<n;i++) { scanf("%d",&a[i]); } for(int i=0;i<(1<<n);i++) { int cur = 0; for(int j=0;j<n;j++) { if(i & (1<<j)) { cur += a[j]; } } vis[cur] = kase; for(int j=0;j<n;j++) { if(cur - a[j] < 0) continue; vis[cur-a[j]] = kase; } } scanf("%d",&m); while(m--) { scanf("%d",&k); if(k < 0 || k > 30000) { printf("NO\n"); continue; } if(vis[k] == kase) printf("YES\n"); else printf("NO\n"); } } return 0; }
以上是关于HDU 5616 Jam's balance(暴力枚举子集)的主要内容,如果未能解决你的问题,请参考以下文章
Jam's balance HDU - 5616 (01背包基础题)
hdu 5616 Jam's balance(dp 正反01背包)
HDU 5616 Jam's balance(Jam的天平)