当前位置: 首页 > article >正文

ACwing—01背包(暴力bfs+dp+递归+记忆化搜索算法)

问题

有 N件物品和一个容量是 V 的背包。每件物品只能使用一次。

第 i 件物品的体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

输入格式

第一行两个整数,N,𝑉,用空格隔开,分别表示物品数量和背包容积。

接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i件物品的体积和价值。

输出格式

输出一个整数,表示最大价值。

数据范围

0<N,V≤10000
0<vi,wi≤10000

输入样例

4 5
1 2
2 4
3 4
4 5

输出样例:

8

代码一(暴力bfs):

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1010;
int v[N],w[N];
int n,m,res=0;
int dfs(int x,int reme)
{
    if(x>n) return 0;
    else if(reme<v[x]){
        return dfs(x+1,reme);
    }else if(reme>=v[x]){
        return max(dfs(x+1,reme),dfs(x+1,reme-v[x])+w[x]);
    }
    
    
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>v[i]>>w[i];
    }
    int res=dfs(1,m);//从第一个位置开始,第二个代表剩余背包容积
    cout<<res<<'\n';
}

代码二(记忆化搜索):

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1010;
int v[N],w[N];
int mem[N][N];
int n,m;
int dfs(int x,int reme)
{
    if(mem[x][reme]) return mem[x][reme];
    int sum=0;
    if(x>n) {
        sum= 0;
    }
    else if(reme<v[x]){
        sum= dfs(x+1,reme);
    }else if(reme>=v[x]){
        sum= max(dfs(x+1,reme),dfs(x+1,reme-v[x])+w[x]);
    }
    mem[x][reme]=sum;
    return sum;
    
    
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>v[i]>>w[i];
    }
    int res=dfs(1,m);//从第一个位置开始,第二个代表剩余背包容积
    cout<<res<<'\n';
}


http://www.kler.cn/a/585315.html

相关文章:

  • std::span
  • 【软考-架构】4.2、嵌入式软件-系统-RTOS-软件开发
  • 03.Python基础2
  • 【蓝桥杯集训·每日一题2025】 AcWing 4905. 面包店 python
  • Android LeakCanary使用与原理深度解析
  • R语言基础| 高级数据管理
  • mne溯源相关说明
  • ChatGPT、DeepSeek、Grok 三者对比:AI 语言模型的博弈与未来
  • RTSP/Onvif视频安防监控平台EasyNVR调用接口返回匿名用户名和密码的原因排查
  • Linux内核实时机制19 - RT调度器3 - 实时任务出入队
  • 【vLLM 学习】使用 TPU 安装
  • C++11 编译使用 aws-cpp-sdk
  • HTTP相关问题(AI回答)
  • 前端开发中的设计模式:装饰器模式的应用与实践
  • IDEA 一键完成:打包 + 推送 + 部署docker镜像
  • Python区块链应用开发从入门到精通
  • 深入理解 Python 中的进程池
  • leetcode203.移除链表元素
  • android 新闻客户端和springboot后台开发(一)
  • vue2:el-table列中文字前面加icon图标的两种方式