牛客网编程题 牛牛的背包 背包问题的dfs方法

https://www.nowcoder.com/practice/bf877f837467488692be703735db84e6?tpId=98&tqId=32831&tPage=1&rp=1&ru=%2Fta%2F2019test&qru=%2Fta%2F2019test%2Fquestion-ranking

思路:

本题的背包容量较大,而物品的数量较少,所以不适合采用动态规划的解法。
于是我们可以使用dfs的方法,也就是枚举,每一种物品都有选与不选两种选择。

代码如下:

#include<stdio.h>
#include<iostream>
#include<vector>
#include<math.h>
#define INF 0x3f3f3f3f
using namespace std;

long ans=0;//总方法数
int n;//n个物品
long w;//w为背包容量
vector<long> value;//物品的重量

void dfs(long sum,int loc){
    if(sum>w) return;//若不能再装
    if(sum<=w){//若仍然可以再装
        ++ans;
    }
    for(int i=loc;i<n;++i){
        dfs(sum+value[i],i+1);
    }
}

int main(){
    cin>>n>>w;
    long total=0;
    for(int i=0;i<n;++i){
        int b;
        cin>>b;
        value.push_back(b);
        total+=value[i];
    }
    if(total<=w){//若n个物品的总重量都小于w,则有2的n次方种方法
        ans=pow(2,n);
    }else{
        sort(value.begin(),value.end());
        dfs(0,0);
    }
    cout<<ans<<endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/zzh1582188532/p/12159073.html