[P1441]砝码称重 (搜索+DP)

对于我这种蒟蒻,是很不错的一题了。

dfs搜索当前状态

满足时DP

比较坑的地方就是起始的地方

我一开始从1开始,搜索写的是从0开始。

后来就统一用0开始的了。

#include<bits/stdc++.h>
#define max(a,b) (a>b?a:b)
using namespace std;
int n, m;
int a[25],ans;
bool f[2005];
bool vis[25];
void dp()//背包 滚存优化是看一个大佬的题解的
{
    memset(f, 0, sizeof f);
    f[0] = true;
    int ret = 0, tot = 0;
    for (int i = 0; i < n; i++)
    {
        if (vis[i]) continue;
        for (int j = tot; j >= 0; j--)if (f[j] && !f[j + a[i]]) f[j + a[i]] = true, ret++;
        tot += a[i];
    }
    ans = max(ans, ret);
}
void dfs(int x,int y)//搜索
{
    if (y > m) return;
    if (x > n) return;
    if (x == n && y==m) {
        dp();//满足的时候DP
        return;
    }
    dfs(x + 1, y);
    vis[x] = true;
    dfs(x+1, y + 1);
    vis[x] = false;
    return;
}
int main()
{
    memset(vis, 0, sizeof(vis));
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    dfs(0,0);
    printf("%d", ans);
    return 0;
}

 

转载于:https://www.cnblogs.com/lincold/p/9821964.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值