背包问题经典实现方法

背包问题解决方法总结 题目 有N件物品和一个容量为V的背包。第i件物品的重量是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。 基本思路有好几种方法,请参考资源文件 立即下载

    背包问题里“背包”的英文是 knopsack ,其基本问题就假设有一个限定重量的背包,若干一定重量的物品,每个物品都有各自的价值, 现在要尽可能的向背包里装入若干物品,使得背包中物品价值之和最大。这个问题在密码学上有重要的应用,有很多先进的算法,可惜我不懂……不过没关系,因为至少我们还有DP,可以使用空间复杂度O(n)时间复杂度O(n^2)的算法圆满实现该算法。

约定:背包的重量为c,物品重量为n,物品的重量为w[i],价值为v[i]。

基本的DP:

假设ks[i,j]表示在前i件物品中选取若干件(每件可以选取多次),使得包内装总重量为j时能得到的最大价值。则:

ks[0,0] = 0

ks[i,j] = max { ks[i-1,j-w[i]*k]+v[i]*k | 1<= k <= c/w[i] }

*如果每种物品只能拿一次(不可重复背包问题),去掉k。

真正实现的时候,由于考察第i种物品的时候只需要i-1有关的信息,所以只需要一个一维数组来储存。

来看一个(我认为)经典的DP程序:

(这段程序大概是这么来的:Somewhere(也许是Maigo的大脑)-->Maigo写的USACO标程-->MiniDragonXG同学消化+改编-->这里)

//以上省略部分代码
        for(i=0;i<=c;i++) ks[i]=-1;
        ks[
0]=0;
        
for(i=1;i<=n;i++){
                
for(j=w[i];j<=c;j++)  //改为for(j=c;j>=w[i];j--) 就能求不可重复背包问题
                        if(ks[j-w[i]]>=0 && ks[j]<ks[j-w[i]]+v[i]) 
                                     ks[j]=ks[j-w[i]]+v[i];
        }

        max
=-1;
        
for(i=0;i<=s;i++) if(ks[i]>max) max=ks[i];

//max即为最大价值

这一段程序融合了背包状态存在性问题和可重复/不可重复问题,可谓做基本背包问题的居家良药啊-_-b

搜挂了3道有数据的题(贴在下面),一举拿下(也贴在下面),你也试试?(什么,你BS我……那我也BS你……靠)

USACO Training Page Section 3.1 Score Inflation

Score Inflation

The more points students score in our contests, the happier we here at the USACO are. We try to design our contests so that people can score as many points as possible, and would like your assistance.

We have several categories from which problems can be chosen, where a "category" is an unlimited set of contest problems which all require the same amount of time to solve and deserve the same number of points for a correct solution. Your task is write a program which tells the USACO staff how many problems from each category to include in a contest so as to maximize the total number of points in the chosen problems while keeping the total solution time within the length of the contest.

The input includes the length of the contest, M (1 <= M <= 10,000) (don't worry, you won't have to compete in the longer contests until training camp) and N, the number of problem categories, where 1 <= N <= 10,000.

Each of the subsequent N lines contains two integers describing a category: the first integer tells the number of points a problem from that category is worth (1 <= points <= 10000); the second tells the number of minutes a problem from that category takes to solve (1 <= minutes <= 10000).

Your program should determine the number of problems we should take from each category to make the highest-scoring contest solvable within the length of the contest. Remember, the number from any category can be any nonnegative integer (0, one, or many). Calculate the maximum number of possible points.

PROGRAM NAME: inflate
INPUT FORMAT
Line 1:  M, N -- contest minutes and number of problem classes  
Lines 2-N+1:  Two integers: the points and minutes for each class

SAMPLE INPUT (file inflate.in)
300 4
100 60
250 120
120 100
35 20

OUTPUT FORMAT
A single line with the maximum number of points possible given the constraints.
SAMPLE OUTPUT (file inflate.out)
605

(Take two problems from #2 and three from #4.)

 

//score inflation
#include<stdio.h>
int main(void)
{
        FILE 
*fin=fopen("inflate.in","r");
        FILE 
*fout=fopen("inflate.out","w");
         
        
long n,w,v,c;
        
long ks[10001];
        
int i,j;
        fscanf(fin,
"%d %d ",&c,&n);
        
for(i=0;i<=c;i++) ks[i]=-1;
        ks[
0]=0;
        
for(i=1;i<=n;i++){
                fscanf(fin,
"%d %d ",&v,&w);
                
for(j=w;j<=c;j++)
                        
if(ks[j-w]>=0 && ks[j]<ks[j-w]+v) ks[j]=ks[j-w]+v;
        }


        
for(i=c,j=-1;i>=0;i--) if(ks[i]>j)j=ks[i];
        fprintf(fout,
"%d ",j);
        
return 0;
}

         

 

NOIP2001普及组 装箱问题

描述 Description  
    有一个箱子容量为v(正整数,o≤v≤20000),同时有n个物品(o≤n≤30),每个物品有一个体积 (正整数)。要求从 n 个物品中,任取若千个装入箱内,使箱子的剩余空间为最小。
   
   
 输入格式 Input Format 
  第一行,一个整数,表示箱子容量;
第二行,一个整数,表示有n个物品;
接下来n行,分别表示这n个物品的各自体积。
   
   
 输出格式 Output Format 
  一个整数,表示箱子剩余空间。
//装箱问题
    #include<stdio.h>
#include
<stdbool.h>
int main(void)
{
        
int n,v;
        
int i,j;
        
int ans;
        
bool ks[20001];
        
int w[31];
        
bool found=false;
        scanf(
"%d %d ",&v,&n);
        
for(i=1;i<=n;i++) scanf("%d ",&w[i]);
        memset((
void*)ks,0,sizeof(ks));
        ks[
0]=true;
        
for(i=1;i<=n;i++)
                
for(j=v;j>=w[i];j--)
                        ks[j]
=ks[j] || ks[j-w[i]];
        
for(ans=v;!ks[ans];ans--);
        printf(
"%d ",v-ans);
        
return 0;
}

 

NOIP2006 OIBH第三次模拟赛普及组Problem 3 : maxsum 最大约数和

Problem 3 : maxsum 最大约数和
源文件名:maxsum.(pas/c/cpp)
输入文件:maxsum.in
输出文件:maxsum.out
时间限制:1秒
空间限制:64M
问题描述
选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大。
输入格式
输入一个正整数S。
输出格式
输出最大的约数之和。
样例输入
11
样例输出
9
样例说明
取数字4和6,可以得到最大值(1 + 2) + (1 + 2 + 3) = 9。
数据规模...

 

#include<stdio.h>
#include
<math.h>
int main(void)
{
        
int ks[1001];
        
int s,i,j,v;
        FILE 
*fin=stdin;
        fscanf(fin,
"%d ",&s);
        
for(i=0;i<=s;i++) ks[i]=-1;
        ks[
0]=0;
        
for(i=1;i<=s;i++){
                v
=value(i);
                
for(j=i;j<=s;j++)
                        
if(ks[j-i]>=0 && ks[j]<ks[j-i]+v) ks[j]=ks[j-i]+v;
        }

        v
=-1;
        
for(i=0;i<=s;i++) if(ks[i]>v) v=ks[i];
        printf(
"%d ",v);
        
return 0;
}

int value(int x)
{
        
int ans=1;
        
int i;
        
if(x==1) return 0;
        
for(i=2;i<x;i++)
                
if(!(x%i)) ans+=i;
        
return ans;
}

经典的背包问题九讲,必看 背包九讲,经典的背包问题讲解,不用做过多介绍,必看 立即下载

相关推荐

mongoDB 数据莫名其妙的没了

问题 之前没有接触过mongoDB,然后接手一个项目使用的是MongoDB,我就跟着网上的教程搭建一个MongoDB的服务,并运行起来。 一开始没有啥问题,成功的把服务与MongoDB都启动以来,运行也没有问题。但是过了几天,我再次打开时发现,以前的数据神奇的消失了。我还在想,是有什么定时清除的么,还是什么原因导致崩了然后数据就被清理了。 查找原因 第一次遇到我没有在意,重启了一下MongoDB,...

技术熊的博客小窝 1万+

【背包问题】混合遗传算法求解背包问题(目标函数:总重 总价值)【含Matlab源码 4661期】

混合遗传算法求解背包问题(目标函数:总重 总价值) 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 1059

RK3588开发板DDR频率上不去?手把手教你用ddrbin_tool降频调优(附完整配置流程)

本文详细介绍了RK3588开发板DDR频率调优的完整解决方案,重点使用ddrbin_tool工具进行降频配置。从硬件原理分析到实战操作,包括参数导出、频率调整、二进制生成及烧录验证,帮助开发者解决DDR高频不稳定问题,提升系统可靠性。适用于嵌入式开发、工业控制等场景。

weixin_42713608的博客 544

0-1背包问题 简单R实现

0-1背包问题 简单R实现 本文仅作为学习记录用。 原文链接如下 https://blog.youkuaiyun.com/w113691/article/details/81743201 https://zhuanlan.zhihu.com/p/30959069 https://blog.youkuaiyun.com/shanghairuoxiao/article/details/62426727 之前遇到了没有深度...

u012223434的博客 819

从BAM到bigWig:用UCSC工具链完成测序数据可视化的完整流程

本文详细介绍了从BAM文件到bigWig格式的基因组数据可视化完整流程,涵盖UCSC工具链配置、文件格式转换、参数优化及常见问题解决方案。通过实战指南帮助研究人员高效完成测序数据可视化,特别适合ChIP-seq和RNA-seq数据分析。

weixin_29309213的博客 707

彻底解决0x80070005错误代码:全面分析与实战指南

0x80070005错误代码虽然令人头疼,但通过上述方法,我们完全有能力将其攻克。从检查磁盘空间、设置账号权限,到运行疑难解答和系统文件检查器,再到调整相关服务状态,每一步都是解决这一问题的关键。希望本文能为你提供有力的帮助,让你在使用Windows系统的过程中更加顺畅无忧。

nntxthml的博客 6933

背包问题算法全解析:动态规划和贪心算法详解

计算机背包问题是动态规划算法中的经典问题。本文将从理论和实践两个方面深入探讨计算机背包问题,并通过实际案例分析,帮助读者更好地理解和应用该问题。

BASK2311的博客 6470

Vscode + QT + CMake:高效开发环境搭建全攻略

本文详细介绍了如何搭建Vscode+QT+CMake高效开发环境,涵盖环境安装、配置优化及项目创建全流程。通过整合Vscode的轻量化编辑、QT的跨平台GUI开发以及CMake的现代构建管理,该组合特别适合大型QT项目和跨平台开发团队,能显著提升开发效率。

weixin_30338481的博客 504

01背包问题的多种求解

关于01背包问题的多种解法

m0_64862358的博客 5173

HWSD全球土壤数据下载处理

下载地址: http://www.fao.org/soils-portal/soil-survey/soil-maps-and-databases/harmonized-world-soil-database-v12/en/

江北20190411的博客 3万+

SPMI总线协议(一)

系统电源管理接口( System Power Management Interface简称SPMI)是一种双线串行接口,用于连接片上系统(SoC)处理器系统的集成电源控制器(PC)与一个或多个电源管理集成电路(PMIC)电压调节系统。SPMI 使系统能够使用单个 SPMI 总线动态调整 SoC 内部电压域的电源和衬底偏置电压。移动设备和其他便携式设计正日益采用系SPMI)协议,实现多主多从系统,根据实时系统需求监测和动态控制供电电压。设计人员可以在系统级实现更低的功率。

qflook的博客 886

0-1 背包问题的 4 种解决方法&&算法策略

蛮力法 递归与分治策略 动态规划 贪心算法 回溯法 分支限界法 前言 0-1背包是一个经典的问题,而它能用不同的算法思想去解决。恰巧最近在看算法,学习算法就是学习解决问题的思路。现在将0-1背包问题与解决方法整理出来,这样不仅能区分不同的算法思想,还能加深对0-1背包问题的理解。虽然有的算法思想并不能解决这一问题,但是为了对算法策略有一个较为整体的了解,所以在这里做一下简单的介绍。 ...

Tyler_Zx的博客 6万+

[QMT量化交易小白入门]-七十九、增加标的后,五年回测收益率达到了2493%

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 1574

背包问题???

这星期水sdnuoj,有个人问我采药做没做,讲真的我是一点思路也没有。于是我就百度了一下,之后发现这是一种经典题型,背包问题。 我看了看背包问题有很多种 其中sdnuoj 1033是一道01背包问题,1043是一道完全背包问题,大概就是这样,我从百度文库和各位大佬那里学了一些,有点懂了,也不敢说全懂,讲一讲看法。 其中1033是这样的 辰辰是个天资聪颖

Changod的博客 428

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

动态规划——经典背包问题

经典背包问题1.题目2.输入3.输出格式40C++实现 1.题目 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N 元钱就行”。今天一早金明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的N 元。于是,他把每件物品规定了一个重要度,分为5 等:用整数1~5 表示,第5 等最重要。他还从因特网上查到了每件物品的价格(都是整数元)。他希望在不超过N 元(可以等于N 元)的前提下

JinLn的博客 254

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

经典01背包问题

问题描述 一个旅行者有一个最多能装M公斤的背包,现在有n件物品,它们的重量分别是W1,W2,…,Wn,它们的价值分别为C1, C2, …,Cn。 求旅行者能获得最大总价值。 输入格式 第 1 行:两个整数,M(背包容量,M<=200)和N(物品数量,N <=30); 第 2 到 N+1行: 每行两个整数 Wi,Ci,表示每个物品的重量和价值。 输出格式 仅一行,一个数,表示最大总价值。 输入样例 10 4 2 1 3 3 4 5 7 9 输出样例 12 经典背包问题解法一 // C+

weixin_40895249的博客 1075

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

动态规划-背包问题

动态规划 动态规划(Dynamic Programming,简称DP)动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。 动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。 通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量: 一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。 这种做法在重复子问题的数目关于输入的规模

weixin_41082481的博客 8660

最清楚的01背包问题讲解

题目: 01背包问题描述:有编号分别为a,b,c,d,e的N=5件物品,它们的重量w分别是2,2,6,5,4,它们的价值v分别是6,3,5,4,6,每件物品数量只有一个,现在给你个承重为M=10的背包,如何让背包里装入的物品具有最大的价值总和sum_v? 在DP(dynamic programming,动态规划)问题中,01背包问题是比较基础和简单的了,但是网上很多人的讲解要么...

agn7047的博客 846

课程讲解--背包问题

相信你看完这篇优质好文就会理解什么是背包问题了。

你猜我是谁? 1515

完全背包问题

完全背包问题 1.01背包问题(每种物品只有一件) 2.完全背包问题方法一 3.完全背包问题方法二

莱尼的博客 403

背包问题总结

1.背包问题的定义   背包问题是一种组合优化的NP完全问题。   给定一个有限体积的背包和一组物品,每个物品都有自己的重量和价值,求背包可以装载物品的最大价值。 2.背包问题的分类   背包问题根据每种物品可以装载的数量不同,可以分为以下几类: 01背包:每种物品只能装一次: 完全背包:每种物品可以装无限次 多重背包:每种物品可以装载的次数不同 混合背包:前面几种问题的组合 分组背包:给物品分组,每组物品只能选一个。 3.背包问题的求解   背包问题一般使用动态规划求解,在使用动态规划时要明确4步: 确

weixin_45642990的博客 1633

leetcode背包问题 等分数组

对于这个问题,看起来和背包没有任何关系,为什么说它是背包问题呢? ⾸先回忆⼀下背包问题⼤致的描述是什么: 给你⼀个可装载重量为 W 的背包和 N 个物品,每个物品有重量和价值两 个属性。其中第 i 个物品的重量为 wt[i] ,价值为 val[i] ,现在让你⽤ 这个背包装物品,最多能装的价值是多少? 那么对于这个问题,我们可以先对集合求和,得出 sum ,把问题转化为背 包问题: 经典动态规划:⼦集背包问题 给⼀个可装载重量为 sum / 2 的背包和 N 个物品,每个物品的重量

weixin_45485072的博客 424

经典算法(2)——0/1背包问题(动态规划法)

本博客(http://blog.youkuaiyun.com/livelylittlefish)贴出作者(三二一、小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正!                                                0/1背包问题                                                 1. 问题描

学习,思考,记录,分享。 8万+

【Acwing动态规划】背包问题

Acwing算法基础课动态规划第一节——背包问题。个人认为还算记得比较细,有需要的小伙伴可以看看我的一些思路~自己先在Typora做的笔记导进来的,图片大小没有调整,主要是备份笔记用的。

Dreamer11111111的博客 228

背包问题 DP

4种写法: 背包0-1 #include <iostream> using namespace std; int w[101] = {0}, c[101] = {0}, dp[101][101] = {0}; int main(){ int n, v; cin >> n >> v; for(int i = 1; i <= n; i...

Evildoer_llc的博客 300

浅谈基础DP算法——背包问题(c++)

输入文件medic.in的第一行有两个整数T(1

2301_79587247的博客 1502
上一篇: 背包问题
下一篇: USACO Training:Packing Rectangles (IOI95) Accepted
DaNmarner
博客等级 码龄21年 27粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值