博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
01背包解题模板
阅读量:6378 次
发布时间:2019-06-23

本文共 2047 字,大约阅读时间需要 6 分钟。

骨骼收集器

问题描述

许多年前,在泰迪的家乡,有一个人被称为“骨头收藏家”。这个男人喜欢收集各种各样的骨头,比如狗狗,牛,还有他去了坟墓...... 
骨头收集器有一个大容量V的袋子,沿着他的收集之旅有很多骨头,显然,不同的骨骼具有不同的值和不同的体积,现在根据他的行程给出每个骨骼的值,你能计算出骨骼采集器可以得到的总值的最大值吗?
输入
第一行包含整数T,个案数。
接下来是T个案例,每个案例有三行,第一行包含两个整数N,V,(N <= 1000,V <= 1000)表示骨骼的数量和他的包的体积。第二行包含表示每个骨骼值的N个整数。第三行包含表示每个骨骼体积的N个整数。
 
产量
每行一个整数,表示总值的最大值(此数字将小于2 
31 )。
 
样本输入
1
5 10
1 2 3 4 5
5 4 3 2 1
 
样本输出
14

 

先给大家推荐一个好东西,一个可视化的背包网站,只要你给出数据就能知道中间的运行过程

01背包问题可视化的网站:

01背包无优化版 

 

//N代表数量,V代表背包的容量    //c[i]代表第i个的价值,w[i]代表第i个的体积    int f[N+1][V+1];    memset(f,0,sizeof(f));//初始化    for(int i=1;i<=N;i++){        for(int j=1;j<=V;j++){            if(j>=w[i]){                f[i][j]=max(f[i-1][j-w[i]]+c[i],f[i-1][j]);            }            else{                f[i][j]=f[i-1][j];            }        }    }

 

 

01背包一维数组优化版

//N代表数量,V代表背包的容量    //c[i]代表第i个的价值,w[i]代表第i个的体积    int f[V+1];    memset(f,0,sizeof(f));//初始化    for(int i=1;i<=N;i++){        for(int j=V;j>=0;j--){            if(j>=w[i]){                f[j]=max(f[j-w[i]]+c[i],f[j]);            }        }    }

 

 

01背包常数优化版

 

//N代表数量,V代表背包的容量    //c[i]代表第i个的价值,w[i]代表第i个的体积    int f[V+1];    memset(f,0,sizeof(f));//初始化    int sum=0;    for(int i=1;i<=N;i++){            sum+=w[i];        int bound=max(V-sum,w[i]);        for(int j=V;j>=bound;j--){            if(j>=w[i]){                f[j]=max(f[j-w[i]]+c[i],f[j]);            }            else{                f[j]=f[j];            }        }    }

它的优化就是可以减少不必要的计算。

最后把所有的代码给出

#include
#include
const int N=-1e9+3;using namespace std;int main(){ int N,V; cin >> N >> V; int w[N+1]={
0,0};//重量 int c[N+1]={
0,0};//价值 for(int i=1;i<=N;i++){ cin >> c[i]; } for(int i=1;i<=N;i++){ cin >> w[i]; } //N代表数量,V代表背包的容量 //c[i]代表第i个的价值,w[i]代表第i个的体积 int f[V+1]; fill(f,f+V+1,0);//初始化 for(int i=1;i<=N;i++){ for(int j=V;j>=0;j--){ if(j>=w[i]){ f[j]=max(f[j-w[i]]+c[i],f[j]); } } } cout << f[V]; return 0;}

 

转载于:https://www.cnblogs.com/sddr/p/10730067.html

你可能感兴趣的文章
【本人秃顶程序员】MySQL 全表 COUNT(*) 简述
查看>>
centos7中使用febootstrap自制一个基础的centos 7.2的docker镜像
查看>>
C#开发Unity游戏教程之判断语句
查看>>
安装 SharePoint Server 2007
查看>>
springmvc mybatis 调用sql , 转成json
查看>>
linux centos 7 网卡突然不能上网异常解决
查看>>
授之以渔-运维平台发布模块一(Jenkins篇)
查看>>
DedeCMS操作基础(一)
查看>>
实现MySQL允许远程连接
查看>>
Java Outputstream to String
查看>>
RS232C串口通信接线方法(三线制)
查看>>
Android 自定义View属性相关细节
查看>>
type already defined error in Eclipse
查看>>
OSA 安装
查看>>
先安装.Framework然后再安装IIS,ASP.NET程序不能运行
查看>>
NPOI Excel下拉项生成设置
查看>>
360该不该拍?
查看>>
用Xib创建控制器
查看>>
oracle的sqlplus和dos的中文乱码问题
查看>>
LVS+keepalived高可用负载均衡集群部署(二)---LAMP网站服务器与LVS服务器
查看>>