java 0/1背包问题(恰好装满)递归算法

0/1背包问题:给定背包容量,一系列物品重量,从物品中选取一些出来,看能否恰好将背包装满,用递归算法解答。
思路:
例子在这里插入图片描述
在这里插入图片描述

import java.util.LinkedList;

public class Knapsack {
     
    static int[] items = {
   11,8,7,6,5}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
0-1背包问题是一个经典的动态规划问题,也可以用回溯算法求解,以下是C++的实现代码: ``` #include <iostream> #include <vector> using namespace std; // 递归回溯求解0-1背包问题 void backtrack(vector<vector<int>>& res, vector<int>& items, vector<int>& selected, int capacity, int start) { if(capacity < 0) { return; } if(start == items.size() || capacity == 0) { res.push_back(selected); return; } // 不选当前物品 backtrack(res, items, selected, capacity, start + 1); // 选当前物品 selected[start] = 1; backtrack(res, items, selected, capacity - items[start], start + 1); selected[start] = 0; } vector<vector<int>> solveKnapsack(vector<int>& items, int capacity) { vector<vector<int>> res; vector<int> selected(items.size(), 0); backtrack(res, items, selected, capacity, 0); return res; } int main() { vector<int> items = {2, 3, 4, 5}; int capacity = 7; vector<vector<int>> res = solveKnapsack(items, capacity); for(int i = 0; i < res.size(); i++) { for(int j = 0; j < res[i].size(); j++) { if(res[i][j] == 1) { cout << items[j] << " "; } } cout << endl; } return 0; } ``` 代码思路: 1. 递归函数 backtrack 用于求解 0-1 背包问题,参数 res 表示最终结果,items 表示所有物品的重量,selected 表示当前选中的物品,capacity 表示当前背包的容量,start 表示当前处理的物品编号。 2. 如果当前背包已经装满了或者已经处理完了所有物品,则将结果加入到 res 中,否则分别尝试选取当前物品和不选取当前物品两种情况。 3. 主函数中调用 solveKnapsack 函数求解 0-1 背包问题,并输出结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值