若干数求和判断是否为K

题目描述:有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值。 如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分、3分、4分即可。

//DFS递归剪枝求法
#include "bits/stdc++.h"
using namespace std; 
int a[21];
int fsum;
    int n;
vector<int> fdepth;
void dfs (int i, int sum, int depth){
    if (i > n - 1) return ;
    if (sum > fsum) return ;
    else if (sum == fsum) {
        fdepth.push_back(depth);
//        cout << depth << " " <<endl; 
        return ;
    }
    else   {
        dfs(i+1,sum,depth++);
        dfs(i+1,sum+a[i+1],depth++);
    }

}

bool cmp (const int &a, const int &b){
    return a < b;
}

int main(){
    while (scanf("%d",&fsum) != EOF){
        scanf ("%d", &n);
        memset(a,0,sizeof(a));
        fdepth.clear();
        //将大的留在前面
        for (int i = n - 1; i >= 0; i--){
            scanf ("%d", &a[i]);
        }
        for (int i = 0; i < n; i++){
            dfs(i,a[i],1);
        } 
        if (!fdepth.empty()){
            sort(fdepth.begin(),fdepth.end(),cmp);
            printf("%d\n",fdepth[0]);
        }
        else printf("0\n");
    }
}

这题我是用DFS暴力搜索+贪心剪枝做的,居然神奇的AC了。可能是数据量比较少,理论上时间复杂的是O(2^n),基本上是过不了的。所以,在忘记DP的情况下,大胆剪枝暴力,能得一点分得一点分啊哈哈。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值