zoukankan      html  css  js  c++  java
  • [Luogu] P1441 砝码称重

    题目描述

    现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0)。

    题目分析

    因为读错题WAWA大哭。

    先dfs枚举选的砝码,满足条件时进行dp来求出当前的解的数量。

    Code

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    
    const int MAXN = 20 + 5;
    
    int n,m;
    int a[MAXN],dp[50000];
    int ans;
    bool skip[MAXN];
    
    void __dp(void) {
        int tmp = 0, tot = 0;
        memset(dp,0,sizeof(dp));
        dp[0] = true;
        for(int i = 0;i < n;i++) {
            if(skip[i]) continue;
            for(int j = tot;j>=0;j--) {
                if(dp[j] && !dp[j+a[i]]) dp[j+a[i]] = true,tmp++;    
            }
            tot += a[i];
        }
        ans = max(tmp,ans);
        return;
    }
    
    void dfs(int x,int y) {
        if(y > m)  return;
        if(x == n) {
            if(y == m) __dp();
            return;
        }
        dfs(x+1,y);
        skip[x] = true;
        dfs(x+1,y+1);
        skip[x] = false;
        return;
    }
    
    //3 1
    //1 2 2
    
    int main() {
        scanf("%d%d",&n,&m);
        for(int i = 0;i < n;i++) {
            scanf("%d",&a[i]);
        }
        dfs(0,0);
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    C++用于修饰的keyword
    UVa 884
    yii 使用 mongodb 小工具 YiiMongoDbSuite
    三种网络协议握手
    学习设计模式的前世今生
    B二分法
    链接链接新手变化需要注意哪些问题
    插值与拟合 课件链接
    UVa 740
    疯狂暑期学习计划~~~
  • 原文地址:https://www.cnblogs.com/floatiy/p/9802067.html
Copyright © 2011-2022 走看看