P1441 砝码称重 (状压

#include 
using namespace std;
int n,m;
int a[20];
//怎么觉得要背包一下啊
//把选的砝码作为物品,问能配出多少种不同的容量
//f[i] 选到第   i   个物品 ,能达到的不同重量
//20 * 1000 = 20000 

int lowbit(int x){
    int res = 0 ;
    while(x){
        res += x  & 1;
        x = x >> 1;
    }
    return res;
}


int main(){
    int res = 0 ;
    cin>>n>>m;
    for(int i = 0 ; i < n ; i ++) cin>>a[i];
    for(int i = 0 ; i < (1 << n) ; i++){
        if(lowbit(i) != n-m) continue;
        bitset<2000> dp;  
        int s = 0;
        dp[0] = 1;
        for(int j = 0 ; j < n ; j++){
            if(i >> j & 1){
                s += a[j];
                //dp |= a[j];
                dp |= dp << a[j];
            }
        }

        res = max(res,(int)dp.count());
    }

    cout<

纯属乱搞,感觉正解还是得搜索

你可能感兴趣的:(基本算法,算法,c++,数据结构)