动态规划--输出路径06.25

news2025/4/16 14:23:46

 https://www.cnblogs.com/jbelial/articles/2116074.html

博客参考









https://www.cnblogs.com/jbelial/articles/2116074.html



12. 背包问题求具体方案 - AcWing题库

由于需要求解最小字典序,尝试输入数据时逆序输入,其他不改变,状态含义不变,如下,10/11

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;

const int N = 1010,INF=1e9;
int f[N][N],v[N],w[N];
int path[N];
int n,m;
int ans;
int main(){
    cin>>n>>m;
    f[0][0]=0;
    for(int i = n;i >= 1;i--)cin>>v[i]>>w[i],f[0][i]=-INF;
    for(int i = 1;i <= n;i++)
        for(int j = 0; j <= m ;j++){
        	f[i][j]=f[i-1][j];
        	if(j>=v[i])
            f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]);
        }
    ans=0;
    int tmp;
    for(int i = 1;i <= m;i++){
        if(ans<f[n][i])ans=f[n][i],tmp=i;
    }
    /*
	cout<<tmp<<endl;
    for(int i = 1; i<= n;i++){
    	for(int j = 0;j<=m;j++)
    		cout<<f[i][j]<<" ";
    	cout<<endl;
    }
    */
    for(int i = n;i >= 1;i--){
    	if(tmp-v[i] >= 0 && f[i][tmp]==f[i-1][tmp-v[i]]+w[i]){
    		path[i]=1;
    		tmp-=v[i];
    	}
    }
    for(int i = n;i >= 1;i--){
        if(path[i]==1)cout<<n+1-i<<" ";
    }
    return 0;
}

f[i][j]表示前i个物品,重为j时的最大价值。

如何输出路径,并且保证是最小字典序,AcWing 12. 背包问题求具体方案状态表示的解释 - AcWing

 代码如下:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;

const int N = 1010,INF=1e9;
int f[N][N],v[N],w[N];
int n,m;
//f[i][j]表示从第i个物品开始到第n个物品选择,重不超过j的所有方案对应价值最大值
//f[i][j]=max(f[i+1][j],f[i+1][j-v[i]]+w[i]) 
//f[n+1][j]=0,j=0,1,2,3...,m;
int main(){
    cin>>n>>m;
    for(int i = 1;i <= n;i++)cin>>v[i]>>w[i];
    for(int i = n;i >= 1;i--)
        for(int j = 0; j <= m ;j++){
        	f[i][j]=f[i+1][j];
        	if(j>=v[i])
            f[i][j]=max(f[i+1][j],f[i+1][j-v[i]]+w[i]);
        }
    /*for(int i = 1; i<=n;i++)
    {
    	for(int j = 1; j<= m;j++)
    		cout<<f[i][j]<<" ";
    	cout<<endl;
    }
    */
	for(int i = 1;i <= n;i++){//从小到大枚举 
		//cout<<"m="<<m<<endl;
		if(m-v[i]>=0&&f[i][m]==f[i+1][m-v[i]]+w[i]){// 能选择就选择 
			//cout<<"m="<<m<<endl;
			cout<<i<<" ";
			m-=v[i];
			//cout<<"m="<<m<<endl;
		}
	} 
    return 0;
}

1449. 数位成本和为目标值的最大数字

力扣

 

C++第一版

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 110,INF=1e9;
//4 3 2 5 6 7 2 5 5
//9
//7 6 5 5 5 6 8 7 8
//12
//2 4 6 2 4 6 4 4 4
//5
//6 10 15 40 40 40 40 40 40
//47
//f[i][j],选择前i个物品,重量是j时的所有方案的最大价值 
int f[N][N];
int v[N],w[N];
int m;

int main(){
	f[0][0]=0;
	for(int i = 1;i <= 9;i++){
		cin>>v[i];
		w[i]=1;
	}
	cin>>m;
	//cout<<0<<" ";
	for(int i = 1;i <= m;i++){
		f[0][i]=-INF;
		//cout<<i<<" ";
	}
	//cout<<endl;
	
	for(int i = 1; i<= 9;i++){
		for(int j = 0; j <= m;j++){
			f[i][j]=f[i-1][j];
			if(v[i]<=j)
				f[i][j]=max(f[i][j],f[i][j-v[i]]+w[i]);
			//for(int k = 1; k*v[i]<=j;k++)
			//	f[i][j]=max(f[i][j],f[i-1][j-k*v[i]]+k*w[i]);
			//cout<<f[i][j]<<" ";
		}
		//cout<<endl;
	}
	/*
	cout<<"finally"<<endl;
	for(int i = 1;i <= 9;i++){
		for(int j = 0; j <= m;j++)
			cout<<f[i][j]<<" ";
		cout<<endl;
	}
	*/
	string ans;
	int j = m;
	if(f[9][m]<0)cout<<'"'<<"0"<<'"'<<endl;
	else{	
			//cout<<'"';
			for(int i = 9; i >= 1;i--){
				for(int c = v[i]; j>=c && f[i][j]==f[i][j-c]+w[i];j-=c)
				{
					//cout<<i;
					ans.push_back(i+'0');
				//没有选则v[i] 
			}
		}
			//cout<<'"';
	} 
	cout<<'"';
	cout<<ans;
	cout<<'"';
	return 0;
}

 C++第二版

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 110,INF=1e9;
//4 3 2 5 6 7 2 5 5
//9
//7 6 5 5 5 6 8 7 8
//12
//2 4 6 2 4 6 4 4 4
//5
//6 10 15 40 40 40 40 40 40
//47
//f[i][j],选择前i个物品,重量是j时的所有方案的最大价值 
int f[N];
int v[N],w[N];
int m;

int main(){
	f[0]=0;
	for(int i = 1;i <= 9;i++){
		cin>>v[i];
		w[i]=1;
	}
	cin>>m;
	for(int i = 1;i <= m;i++){
		f[i]=-INF;
	}
	for(int i = 1; i<= 9;i++)
		for(int j = 0; j <= m;j++){
			if(v[i]<=j)
				f[j]=max(f[j],f[j-v[i]]+w[i]);
		}
	string ans;
	int j = m;
	if(f[m]<0)cout<<'"'<<"0"<<'"'<<endl;
	else{	
			for(int i = 9; i >= 1;i--){
				for(int c = v[i]; j>=c && f[j]==f[j-c]+w[i];j-=c)
				{
					ans.push_back(i+'0');
				//没有选则v[i] 
			}
		}

	} 
	cout<<'"';
	cout<<ans;
	cout<<'"';
	return 0;
}

 leedcode提交:

class Solution {
public:
    string largestNumber(vector<int>& cost, int target) {
        //f[i][j],选择前i个物品,重量是j时的所有方案的最大价值 
        int f[5050];
        f[0]=0;
        for(int i = 1;i <= target;i++){
            f[i]=-1000000000;
        }
        for(int i = 1; i<= 9;i++){
            for(int j = 0; j <= target;j++){
                if(j-cost[i-1]>=0)//多重背包问题
				    f[j]=max(f[j],f[j-cost[i-1]]+1);
            }
        }
        string ans;//记录路径
        int j = target;//输出路径
        if(f[target]<0)ans.push_back('0');//小于0,没有满足题意的方案
        else{	
                for(int i = 9; i >= 1;i--){//枚举
                    for(int c = cost[i-1]; j>=c && f[j]==f[j-c]+1;j-=c)//f[i][j]=f[i-1][j],f[i-1][j-v[i]]+1
                    {
                        ans.push_back(i+'0');
                        //选择v[i] ,f[i][j]=f[i-1][j-v[i]]+1
                }
            }
        } 
        return ans;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/704648.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

奇安信浏览器调用JM9硬件解码操作教程

本文讲述如何通过奇安信浏览器调用景嘉微JM9系列显卡的硬件解码。 判断硬件解码是否打开方法 1.检查奇安信浏览器版本。dpkg -l | grep qaxbrowser&#xff0c;我这里是1.0.45209.2-1版本。要大于等于这个版本的奇安信浏览器才支持硬件解码。 2.打开奇安信浏览器&#xff…

海思平台OSD的实现

目录 1.海思平台OSD理论学习 1.1、OSD概述 1.2、海思OSD的4种类型 1.3、海思OSD的几个重要概念 1.4、海思平台OSD使用方法 1.5、海思平台OSD的API和关键数据结构 2.使用海思接口实现OSD---代码框架 2.1、函数调用层次 2.2、前\背景透明度、背景颜色 3.使用字库字符实现…

Jmeter远程服务模式运行时引用csv文件的路径配置

目录 前言&#xff1a; 问题 解决方法 前言&#xff1a; 在JMeter远程服务模式下运行时&#xff0c;你可以通过配置CSV文件的路径来引用该文件。CSV文件经常用于存储测试数据&#xff0c;可以在测试中进行参数化。 问题 在使用jmeter过程中&#xff0c;本机的内存等配置不…

掌握GDB调试工具,轻松排除bug!

一、什么是GDB gdb是GNU debugger的缩写&#xff0c;是编程调试工具。 GDB官网&#xff1a; https://www.gnu.org/software/gdb/GDB适用的编程语言&#xff1a; Ada / C / C / objective-c / Pascal 等。GDB的工作方式&#xff1a; 本地调试和远程调试。 目前release的最新版…

RRT* 算法研究(附 MATLAB 和 Python 实现)

RRT* 算法研究 参考 机器人路径规划、轨迹优化课程-第六讲-RRT*算法原理和代码讲解 路径规划 | 随机采样算法&#xff1a;PRM、RRT、RRT-Connect、RRT* 基于采样的运动规划算法-RRT(Rapidly-exploring Random Trees) 《改进RRT算法在移动机器人路径规划中的应用研究》 理论基础…

全网超全,pytest自动化测试框架pytest.ini配置文件详细(实战)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 pytest配置文件可…

Java 实现word、excel、ppt、txt等办公文件在线预览功能!

如何用 Java 实现word、excel、ppt、txt等办公文件在线预览功能&#xff1f;本文告诉你答案&#xff01; java 实现办公文件在线预览功能是一个大家在工作中也许会遇到的需求&#xff0c;网上些公司专门提供这样的服务&#xff0c;不过需要收费。 如果想要免费的&#xff0c;…

【ISO26262】汽车功能安全:以汽车安全完整性等级为导向和以安全为导向的分析

关于 ASIL剪裁的要求分解 表 A.1 以汽车安全完整性等级为导向和以安全为导向的分析的概览

Android Binder通信原理(五):Java 端的service 注册和获取

源码基于&#xff1a;Android R 0. 前言 在阐述相关的知识点&#xff0c;先整理个框架图&#xff0c;后面带着框架图来分析过程&#xff1a; Java 端对于binder 使用大致分为&#xff1a; Java client Java serviceJava client native service Java 端service 的注册使用 Se…

前端如何进行页面优化_如何优化前端页面

优化前端页面 1 .前期准备 1.1 首页命名为index.html / index.htm / index.php等。 1.2 需要制作404页面。 1.3 文件夹结构合理。 1.4 命名使用英文且有语义性的单词&#xff0c;并提供参考文档。 2 .结构 2.1 文件头部分 2.1.1 需要提供文档声明 2.1.2 设置utf-8的编…

虚拟机创建linux系统并使用SSH工具连接

安装VMware Workstation 创建新的虚拟机或从别人那里拷贝虚拟机文件&#xff0c;下面是我从别人那里拷贝的 虚拟机存在后&#xff0c;点击播放按钮启动虚拟机 启动成功后&#xff0c;长这个样子 虚拟机启动成功后&#xff0c;不想用linux指令操作&#xff0c;而是用windows的可…

报错:Information:java: javacTask: 源发行版 8 需要目标发行版 1.8

1.背景 编译项目或启动项目报错 2.解决方法 设置为对应的版本 3.完美

DOM编程实现动态时钟

文章目录 第一种&#xff1a;第二种&#xff1a;第三种&#xff1a; 以下是一个使用 JavaScript 和 DOM 编程实现的动态实时的时钟应用&#xff1a; 第一种&#xff1a; HTML&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"…

想知道PDF转高清图片软件哪个好?

张琳是一名设计师&#xff0c;她经常需要将自己的设计作品整理成PDF文档&#xff0c;以便向客户展示和交付。然而&#xff0c;有时客户需要对设计进行更详细的审查&#xff0c;而PDF格式的文件并不方便进行缩放和查看细节。这一问题让张琳感到非常困扰&#xff0c;她希望能够找…

HttpWatch用于界面单页性能测试

HttpWatch是强大的网页数据分析工具&#xff0c;作为插件可集成在IE工具栏&#xff0c;包括网页摘要、Cookies管理、缓存管理、消息头发送/接受、字符查询、POST 数据和目录管理功能、以及报告的输出。今天笔者就介绍HttpWatch的安装及使用。一、HttpWatch的安装 1、在百度下载…

UNI-APP前端项目开发实战

一、创建项目 1.创建项目分为通过HBuilderX可视化界面和vue-cli命令行两种方式创建 2.官方推荐使用HBuilderX可视化界面方式创建,主要是编译器跟随开发工具升级,vue-cli是跟在项目中的,需要手动通过 npx @dcloudio/uvm 命令升级。 3.使用HBuilderX有一个弊端就是无…

【雕爷学编程】Arduino动手做(135)---W5100 网络扩展板模块

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

中小企业怎么轻松搭建产品发行说明文档?

发行说明是产品上线必备的文档&#xff0c;它包含了项目进度的跟踪和产品版本的基础信息以及新增功能的介绍。 以下是为什么您需要发行说明的几个原因&#xff1a; 1.通知用户新功能&#xff1a;发行说明是向用户传达团队正在进行的工作和产品更新的重要途径。定期更新发行说明…

Selenium系列(三) - 详细解读针对元素常见的简单操作

针对元素有哪些常见的简单操作&#xff1f; 点击输入内容、清除内容返回元素尺寸、坐标获取元素标签文本获取元素属性值检查元素&#xff1a;是否可见、是否可点击、是否已被选择表单提交 点击右边目录即可跳转哦&#xff01; -------------->>>>>>>>…

服务器压力测试

目录 一、磁盘性能测试安装fio磁盘性能测试工具测试内容为顺序读、随机读、顺序写、随机写、随机读写结果分析 二、CPU性能测试安装sysbench性能测试工具结果分析 三、内存性能测试结果分析 四、网络性能测试测试iperf3工具测试结果分析1.测试TCP吞吐量2 . 测试UDP丢包和延迟 此…