poj1015(dp输出路径)

2024-02-02 22:48
文章标签 输出 路径 dp poj1015

本文主要是介绍poj1015(dp输出路径),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

链接:点击打开链接

题意:有n个人,每个人有一个D值和P值,求选出m个人,使得|∑(D)-∑(P)|最小,如果最小值相同,则选择|∑(D)+∑(P)|较大的,输出选出的人和∑(D),∑(P)

代码:

#include <vector>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
vector<int> path[8005][25];
int a[205],b[205];
int dp[8005][25],sum[8005][25];
int main(){int n,m,i,j,k,p,cas,tmp;int ansa,ansb,tmpa,tmpb;cas=1;while(scanf("%d%d",&n,&m)!=EOF&&(n||m)){memset(dp,0,sizeof(dp));memset(sum,0,sizeof(sum));for(i=0;i<=40*n;i++)for(j=0;j<=m;j++)path[i][j].clear();for(i=1;i<=n;i++)scanf("%d%d",&a[i],&b[i]);dp[0][0]=1;                             //dp[i][j]表示能否用j个数,使得差值和为ifor(i=1;i<=n;i++){                      //sum[i][j]表示j个数,差值是i时和的最大值tmp=a[i]-b[i]+20;                   //因为是求绝对值最小,因此需要将所有数加上for(j=40*m;j>=tmp;j--){             //20避免出现负数for(k=m;k>=1;k--){if(!dp[j-tmp][k-1])continue;if(!dp[j][k]){              //看dp[j][k]是否被询问过sum[j][k]=sum[j-tmp][k-1]+a[i]+b[i];path[j][k]=path[j-tmp][k-1];path[j][k].push_back(i);dp[j][k]=1;}else if(sum[j][k]<sum[j-tmp][k-1]+a[i]+b[i]){sum[j][k]=sum[j-tmp][k-1]+a[i]+b[i];path[j][k]=path[j-tmp][k-1];path[j][k].push_back(i);}                           //path记录路径}}}p=0;                                    //正常要找0上下最小的,现在因为每个数while(!dp[20*m-p][m]&&!dp[20*m+p][m])   //都加上20,所以找20*m上下的p++;if(!dp[20*m+p][m]){ansa=abs(-p+sum[20*m-p][m])/2;      //已知a+b和a-b求a和bansb=(sum[20*m-p][m]+p)/2;          //要注意正负号tmpa=20*m-p;}else if(!dp[20*m-p][m]){ansa=abs(p+sum[20*m+p][m])/2;ansb=(sum[20*m+p][m]-p)/2;tmpa=20*m+p;}else{if(sum[20*m+p][m]>sum[20*m-p][m]){ansa=abs(p+sum[20*m+p][m])/2;ansb=(sum[20*m+p][m]-p)/2;tmpa=20*m+p;}else{ansa=abs(-p+sum[20*m-p][m])/2;ansb=(sum[20*m-p][m]+p)/2;tmpa=20*m-p;}}printf("Jury #%d\n",cas++);printf("Best jury has value %d for prosecution and value %d for defence:\n",ansa,ansb);for(i=0;i<path[tmpa][m].size();i++)printf(" %d",path[tmpa][m][i]);printf("\n\n");}return 0;
}


 

这篇关于poj1015(dp输出路径)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/672214

相关文章

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

python多种数据类型输出为Excel文件

《python多种数据类型输出为Excel文件》本文主要介绍了将Python中的列表、元组、字典和集合等数据类型输出到Excel文件中,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一.列表List二.字典dict三.集合set四.元组tuplepython中的列表、元组、字典

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

Spring AI集成DeepSeek实现流式输出的操作方法

《SpringAI集成DeepSeek实现流式输出的操作方法》本文介绍了如何在SpringBoot中使用Sse(Server-SentEvents)技术实现流式输出,后端使用SpringMVC中的S... 目录一、后端代码二、前端代码三、运行项目小天有话说题外话参考资料前面一篇文章我们实现了《Spring

Rust格式化输出方式总结

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}... 目录Rust格式化输出方式基本的格式化输出格式化占位符Format 特性总结Rust格式化输出方式

MySQL9.0默认路径安装下重置root密码

《MySQL9.0默认路径安装下重置root密码》本文主要介绍了MySQL9.0默认路径安装下重置root密码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录问题描述环境描述解决方法正常模式下修改密码报错原因问题描述mysqlChina编程采用默认安装路径,

使用TomCat,service输出台出现乱码的解决

《使用TomCat,service输出台出现乱码的解决》本文介绍了解决Tomcat服务输出台中文乱码问题的两种方法,第一种方法是修改`logging.properties`文件中的`prefix`和`... 目录使用TomCat,service输出台出现乱码问题1解决方案问题2解决方案总结使用TomCat,

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC