zcmu oj 1711: 背包

本文介绍了如何使用深度优先搜索(DFS)算法解决背包问题,给定背包容量和物品数量,计算不同的装包方式。C++代码展示了从输入读取、状态转移以及计数解的全过程。
摘要由CSDN通过智能技术生成

zcmu oj 1711: 背包
题目描述
你有一个神奇的背包,他的容积是m(0<m<=80),只有你装满他,你才能拿走他,现在给你n(1<=n<=20)个物品Xi(Xi<=m),那么一共有几种方式,可以让你拿走背包?

输入
第一行 n,m

第二行 n个数字

输出
输出方案数

样例输入
3 40
20 20 20
样例输出
3

分析:需要用到dfs的思想。

#include<bits/stdc++.h>  
using namespace std;  
int a[30];  
int mark[30];  
int n, p, m;  
  
void dfs(int step, int sum) {  
    if (sum > m) {  
        return; // 如果当前sum已经大于m,直接返回  
    }  
    if (step == n) {  
        if (sum == m) {  
            p++; // 如果sum等于m,增加计数  
        }  
        return;  
    }  
    dfs(step + 1, sum + a[step]); // 选择当前元素  
    mark[step] = 1; // 标记当前元素为已访问  
    dfs(step + 1, sum); // 不选择当前元素  
    mark[step] = 0; // 恢复标记  
}  
  
int main() {  
    memset(mark, 0, sizeof(mark)); // 初始化mark数组为0  
    while(cin >> n >> m )
    {
    	for (int i = 0; i < n; i++) {  
            cin >> a[i];  
        }  
        p = 0; // 初始化计数器  
        dfs(0, 0); // 从第一个元素开始,sum初始化为0  
        cout << p << endl;  
	}
    
    return 0;  
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值