zoukankan      html  css  js  c++  java
  • 洛谷P1441 砝码称重(搜索,dfs+bitset优化)

    洛谷P1441 砝码称重

    (n) 的范围为 (n le 20)(m) 的范围为 (m le 4)

    暴力遍历每一种砝码去除情况,共有 (n^m) 种情况。

    对于剩余砝码求解可以组合的重量种类数。使用bitset进行求解优化,第 (i) 位为 (1) 代表重量 (i) 可以组合出来。(1) 的位数即为最终答案。

    初始 (bitset[0]=1) ,对于新加砝码 (i) ,重量为 (a[i]) ,更新为 (bitset = bitset | (bitset << a[i]))

    时间复杂度为 (O(n^m imes n imes ext{bitset单次操作时间}))

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<bitset>
    
    using namespace std;
    
    const int maxn = 25;
    const int maxm = 2005;
    int n, m, ans, sum;
    int vis[maxn], a[maxn], f[maxm];
    
    void solve()
    {
        bitset<maxm> cnt;
        cnt[0] = 1;
        for(int i = 1; i <= n; i++){
            if(vis[i] == 1) continue;
            cnt = cnt | (cnt << a[i]);
        }
        int ret = cnt.count();
        ans = max(ans, ret - 1);
    }
    void dfs(int now, int step)
    {
        if(step == m + 1){
            solve();
            return;
        }
        for(int i = now; i <= n; i++){
            vis[i] = 1;
            dfs(i + 1, step + 1);
            vis[i] = 0;
        }
    }
    int main()
    {
        scanf("%d%d", &n, &m);
        sum = 0;
        for(int i = 1; i <= n; i++){
            scanf("%d", &a[i]);
            sum += a[i];
        }
        ans = 0;
        dfs(1, 1);
        printf("%d
    ", ans);
        return 0;
    }
    
  • 相关阅读:
    獲取XML文檔節點的值
    Asp.net之数组应用
    读写XML文档
    C#区分中英文统计字符串的长度
    vs2005常用快捷键
    基础知识
    中国的十二生肖原来还代表着对人品格的要求
    学习OO思想
    改变系统时间c#
    用C#创建各种类型的wave文件
  • 原文地址:https://www.cnblogs.com/solvit/p/11390156.html
Copyright © 2011-2022 走看看