zoukankan      html  css  js  c++  java
  • 砝码称重

    60'

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<bitset>
     5 using namespace std;
     6 const int maxn=27;
     7 const int maxm=2007;
     8 bitset<21>bt;
     9 int n,m,ans,s;
    10 int a[maxn],f[maxn][maxm][3];
    11 bool vis[maxm];
    12 void cunt(int x,int sum,int opt){ 
    13     if(f[x][sum][opt]==1) return; 
    14     if(x==n){
    15         vis[sum]=true;
    16         return;
    17     }
    18     if(opt==0){
    19         if(bt[x+1]!=1) cunt(x+1,sum,1);
    20         cunt(x+1,sum,0);
    21     }
    22     else{
    23         if(bt[x+1]!=1) cunt(x+1,sum+a[x+1],1);
    24         cunt(x+1,sum+a[x+1],0);
    25     }
    26     f[x][sum][opt]=1;
    27     return;
    28 }
    29 void prt(int x){
    30     if(x==n+1&&bt.count()==m){
    31         memset(vis,false,sizeof(vis));
    32         memset(f,0,sizeof(f));
    33         cunt(0,0,0);
    34         if(bt[0]!=1) cunt(0,0,1);
    35         int t=0;
    36         for(int i=1;i<=s;i++) if(vis[i]==true) t++; 
    37         ans=max(ans,t);
    38         return;
    39     }
    40     if(bt.count()>m) return;
    41     if(x==n+1&&bt.count()!=m) return;
    42     prt(x+1);
    43     bt.set(x-1,1);
    44     prt(x+1);
    45     bt.set(x-1,0);
    46     return;
    47 }
    48 int main(){
    49     cin>>n>>m;
    50     for(int i=1;i<=n;i++){cin>>a[i];s+=a[i];}
    51     for(int i=1;i<=n;i++) prt(i);
    52     cout<<ans<<endl;
    53     return 0;
    54 }

    100'

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<bitset>
     4 using namespace std;
     5 int n,m,ans;
     6 int val[27];
     7 int count(int x){
     8     int cnt=0;
     9     for(int i=0;i<=n-1;i++){
    10         if(x&(1<<i)) cnt++;
    11     } 
    12     return cnt;
    13 }
    14 int main(){
    15     cin>>n>>m;
    16     for(int i=0;i<n;i++) cin>>val[i];
    17     for(int i=0;i<=(1<<n)-1;i++){
    18         if(count(i)==n-m){
    19             bitset<2007>bt;
    20             bt[0]=1;
    21             for(int j=0;j<=(n-1);j++){
    22                 if(i&(1<<j)) bt=bt|(bt<<val[j]);
    23             }
    24             ans=max(ans,(int)bt.count());
    25         }
    26     }
    27     cout<<ans-1<<endl;
    28     return 0;
    29 }
  • 相关阅读:
    一个关于状态机的问题
    8位同步码修改变4位同步码
    BT1120时序,可以用于自测用
    欧几理德,扩展欧几里德和模线性方程组。
    "旋转的风车"----windows(GDI)绘图
    草滩小恪的学习链接(汇总版)
    酒鬼随机漫步(一个矢量类)
    小题精炼-----初试C语言
    大二(上)------我欠青春一份疯狂
    HDU 1027 Ignatius and the Princess II(康托逆展开)
  • 原文地址:https://www.cnblogs.com/lcan/p/9562654.html
Copyright © 2011-2022 走看看