[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\n",ans);
    return 0;
}

 

posted @ 2018-10-17 09:21  Floatiy  阅读(281)  评论(0编辑  收藏  举报