1064金明的预算(5个dp)

news/2024/7/20 22:45:24 标签: 深度优先

1064 金明的预算

这道题就是一个依赖性背包,通过主件附件就能看出来
输入的时候处理好主件和附件,把附件归到主件里面,在规划的时候跳过附件处理主件,因为本题只有0,1,2附件这几种情况,因此枚举所有情况跑01背包
所有的背包都是根据01背包进行一个拓展,所以01背包基础一定要好
首先,对于01背包的两种情况:
1.不选,考虑下一个
2.选,背包的容量减去这个物品的代价,加上这个物品的价值
所以对于这道题,也分为五种情况:
1.不选,考虑下一个
2.选并且只选这个主件
3.选这个主件,并且选附件1
4.选这个主件,并且选附件2
5.选这个主件,并且选附件1和附件2
于是状态转移方程就有五个
01背包的转移方程是f[j] = max(f[j],f[j-w[i]]+c[i])
这道题的思路不难,只不过就是操作比较恶心人
-----------------重新------------------------------------
每一个主件都有0 1 2三个附件
1.不选,考虑下一个
2.选并且只选这个主件
3.选这个主件,并且选附件1
4.选这个主件,并且选附件2
5.选这个主件,并且选附件1和附件2
这是五个情况

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int SIZE=32005;
int n,m;
int v,p,q;//v表示价格,p表示重要度,q表示主件
int mw[SIZE],mv[SIZE];//主件重量,主件价值 
int fw[SIZE][3],fv[SIZE][3];
int tot;
int f[SIZE];
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>v>>p>>q;
		if(!q)//是主件 
		{
			 mw[i]=v;//主件重量
			 mv[i]=v*p;//重量乘重要度 
		 } 
		 else
		 {
		 	fw[q][0]++;//记录附件的个数 
			fw[q][fw[q][0]]=v;//主件个数是用来确定填在哪一个格子里面 
			fv[q][fw[q][0]]=v*p;//重量乘重要度 
		  }
	}
	for(int i=1;i<=m;i++)
	{
		for(int j=n;j>=mw[i];j--)
		{
			f[j]=max(f[j],f[j-mw[i]]+mv[i]);//啥都不放
			if(j>=mw[i]+fw[i][1]) f[j]=max(f[j],f[j-mw[i]-fw[i][1]]+mv[i]+fv[i][1]);//主件和附件1 
			if(j>=mw[i]+fw[i][2]) f[j]=max(f[j],f[j-mw[i]-fw[i][2]]+mv[i]+fv[i][2]);//主件和附件2 
			if(j>=mw[i]+fw[i][1]+fw[i][2]) 
			f[j]=max(f[j],f[j-fw[i][1]-fw[i][2]-mw[i]]+mv[i]+fv[i][1]+fv[i][2]);//主件和附件1和附件2 
		}
	 }
	 cout<<f[n]<<endl;
	return 0;
}

http://www.niftyadmin.cn/n/851297.html

相关文章

2.4数据结构相关的例程

编译器实现了基础数据类型&#xff08;以及相关的强制转换机制&#xff09;&#xff0c;最小化的Delphi内核实现了可执行模块装载程序。因此&#xff0c;利用这样的最小化内核能够编译的应用只能做到“数据结构十内置运算符”。  在Delphi中使用数据结构&#xff0c;并不是要…

让Editplus自动格式化js、css、html。。。

本人一般用editplus写一些小的测试代码或者来研究学习别人的代码&#xff0c;但经常会遇到这些问题&#xff1a;下载过来的HTML/CSS代码混乱&#xff0c;JS代码被压缩&#xff0c;或者是我们想把我们的代码做一下压缩混淆以供发布时使用。当然&#xff0c;对于代码的格式化和代…

python多进程存储数据_Python多进程编程及多进程间的通信,数据传输

多进程编程及进程间的通信 意义&#xff1a;充分利用计算机的资源提高程序的运算速率 定义&#xff1a;通过应用程序利用计算机多个核心达到同时执行多个任务的目的&#xff0c;以此提高计算机的运行速率 实施方案&#xff1a;多进程 多线程 并行&#xff1a; 计算机同时处理多…

java的md5算法实现_Java实现MD5算法(原来有这么强大的功能)

public static String Encrypt_md5(String strSrc){MessageDigest md null;String strDes null;try {md MessageDigest.getInstance("MD5"); //获取MD5加密实例md.update(strSrc.getBytes()); //得到加密对象,MD5加密算法只是对字节数组进行加密计算byte[] bt md…

可变参数编程

va在这里是variable-argument(可变参数)的意思。 这些宏定义在stdarg.h中&#xff0c;所以用到可变参数的程序应该包含这个头文件。 1.在C中&#xff0c;当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表 void foo(...);void foo(parm_list,...);这种方…

一个无敌删除命令

告诉大家一个无敌删除命令&#xff0c;任意无法删除的文件都能删除告诉大家一个无敌删除命令&#xff0c;这个秘密只有我知道啊。新建 文本文档 写入下列命令&#xff1a;DEL /F /A /Q //?/%1RD /S /Q //?/%1另存为 统统删除.bat然后&#xff0c;要把要删…

集体智慧常用算法

1、PageRank算法&#xff1a;<?xml:namespace prefix"O">?xml:namespace>它是Google排名运算法则&#xff08;排名公式&#xff09;的一部分&#xff0c;是Google用于用来标识网页的等级/重要性的一种方法&#xff0c;是Google用来衡量一个网站的好坏的唯…

break后面的语句还执行吗_Java中的break循环——通过示例学习Java编程(13)

作者&#xff1a;CHAITANYA SINGH来源&#xff1a;通过示例学习Java编程&#xff08;13&#xff09;&#xff1a;Java中的break循环-方家话题break语句通常用于以下两种情况&#xff1a;&#xff08;A&#xff09;使用break语句的目的是让程序从循环中立即跳出来。每当程序在执…