hdu 5890 Eighty seven 背包bitset
2016-09-17 21:12
363 查看
题意:
给出n(n<=50)个数,然后有Q(Q<=1e5)个查询,每次查询相互独立,内容是:抽走1到3个数,然后问剩下的数中,能否有10个数凑成87。解法:
学别人写的bitset去优化背包,原来还STL还有bitset这个东西。比赛的时候想优化结果想错了,比赛的时候认为就是先进行背包,然后
等价于求dp[87+sumV][10+cnt]
反例是 4 4 3 6 ,4+4+3=11,11-6=5,然而凑不成5。
代码:
g++可以过#include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> #include<bitset> using namespace std; #define for0(a, n) for (int (a) = 0; (a) < (n); (a)++) #define for1(a, n) for (int (a) = 1; (a) <= (n); (a)++) #define mes(a,x,s) memset(a,x,(s)*sizeof a[0]) #define mem(a,x) memset(a,x,sizeof a) typedef long long ll; const int INF =0x3f3f3f3f; const int maxn=50 ; int n,a[maxn+5],b[3]; int ans[52][52][52]; void solve() { for0(i,3) cin>>b[i]; sort(b,b+3); int & ret=ans[b[0] ][b[1] ][b[2] ]; if(~ret) { puts(ret?"Yes":"No"); return; } bitset<90>dp[11]; dp[0][0]=1; for1(i,n) if( i!=b[0]&&i!=b[1]&&i!=b[2] && a[i]<=87 ) { for(int k=10;k>=1;k--) { dp[k]|=dp[k-1]<<a[i]; } } ret=dp[10][87]?1:0; puts(ret?"Yes":"No"); } int main() { std::ios::sync_with_stdio(false); int T,Q;cin>>T; while(T--) { mem(ans,-1); cin>>n;for1(i,n) cin>>a[i]; cin>>Q;while(Q--) solve(); } return 0; }
相关文章推荐
- hdu 5890 Eighty seven(背包+bitset)
- hdu 5890 Eighty seven 暴力+bitset优化背包
- hdu 5890 bitset+背包思想
- hdu_5890_Eighty seven(bitset优化DP)
- HDU 5890 Eighty seven(bitset优化dp)
- hdu 5890 Eighty seven
- Hdu 5890 Eighty seven
- hdu 6140 Hybrid Crystals 阅读题 OR bitset 优化01背包
- HDU 5890 Eighty seven ACM/ICPC 2015 Shenyang Online(DP+bitset优化)
- hdu 5890 01背包(bitset优化)
- hdu 5890 dp+bitset+输入挂
- 【HDU 5890】Eighty seven(bitset+DP+优化)
- hdu 6140 bitset+背包
- Hdu 5890 Eighty seven
- hdu5890 Eighty seven(背包+bitset优化)
- HDU 5313 bitset优化背包
- HDU5890:Eighty seven(Bitset优化背包)
- HDU 5890 Eighty seven
- [HDOJ5890]Eighty seven(暴力,dp,bitset)
- HDU 3446 有贪心思想的01背包