acwing 2 零一背包问题】的更多相关文章

地址 https://www.acwing.com/problem/content/description/2/ 题目描述有 N 件物品和一个容量是 V 的背包.每件物品只能使用一次. 第 i 件物品的体积是 vi,价值是 wi. 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大.输出最大价值. 输入格式第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积. 接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值. 输出格式输…
题目大概的意思就是:小强用硬币买东西,硬币有N种,面值为Vi,店家有各种硬币都有无限个,而小强只有Ci个(分别对应Vi) 问最小交易硬币数,就是一个有找零的背包问题啦. 我的上一篇博客跟这hdu3591的类型非常非常接近,所以我很快就写完,并且很快地WA了无数次. 后来很苦恼,看看别人写的代码,他们的思想大概是这样子.用dp2去记载找零,就是dp2[i]=min{dp2[i],dp2[i-V]+1 } V为要付的总款 之后再从V到INF处得到ans=min{ans,dp[i]+dp2[i-V]}…
本章将会学习递归.动态规划和贪心算法. 第十一章 算法模式 递归 递归是一种解决问题的方法,它解决问题的各个小部分,直到解决最初的大问题.递归通常涉及函数调用自身. 递归函数是像下面能够直接调用自身的方式或函数 function recursiveFunction(someParam){ recursiveFunction(someParam); } 能够像下面这样间接调用自身的函数,也是递归函数 function recursiveFunction1(someParam){ recursive…
题目描述 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都需要改变一次音量.在演出开始之前,他已经做好一个列表,里面写着每首歌开始之前他想要改变的音量是多少.每一次改变音量,他可以选择调高也可以调低. 音量用一个整数描述.输入文件中整数beginLevel,代表吉他刚开始的音量,整数maxLevel,代表吉他的最大音量.音量不能小于0也不能大于maxLevel.输入中还给定了n个整数$c_1,c_2,c_3,...,c_n$,表示在第i首歌开始之前吉他手…
Q: 既是多重背包, 还是找零问题, 怎么处理? A: 题意理解有误, 店主支付的硬币没有限制, 不占额度, 所以此题不比 1252 难多少 Description Farmer John has gone to town to buy some farm supplies. Being a very efficient man, he always pays for his goods in such a way that the smallest number of coins change…
//f[i,j] 所有只从前i块能量石中选,且总体积恰好为j的方案数 #include <iostream> #include <algorithm> #include <cstring> using namespace std; , M = ; int n; struct Stone { int s, e, l; } stones[N]; bool cmp(Stone a, Stone b) { return a.s * b.l < b.s * a.l;//要写…
//g[i,j]表示f[i,j]取最大值的方案数目 //体积最多是j 全部为0,v>=0 //体积恰好为j f[0][0]=0,f[i]=无穷,v>=0 //体积至少是j f[0][0]=0,f[i]=无穷,体积为负数时于0取大 #include <cstring> #include <iostream> using namespace std; , mod = 1e9 + ; int n, m; int f[N], g[N]; int main() { cin >…
#include <cstring> #include <iostream> #include <algorithm> using namespace std; ; int n, m; int v[N], w[N]; int h[N], e[N], ne[N], idx; int f[N][N]; //f[i,j]表示所有从以i为根的子树中选,且总体积不超过j的方案 void add(int a, int b) { e[idx] = b, ne[idx] = h[a],…
#include<iostream> #include<algorithm> #include<cstring> using namespace std ; ; int f[N],g[N],q[N]; int n,m; int a[N]; int main() { cin>>n>>m; ; i<=n; i++) { int v,w,s; cin>>v>>w>>s; ) { //完全背包 for(int j…
//f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]) #include <iostream> using namespace std; ; int n, m; int v[N], w[N]; int f[N][N]; int main() { cin >> n >> m; ; i <= n; i ++ ) cin >> v[i] >> w[i]; ; i -- )//最小字典序,从前往后推,那么做dp的时…
#include<iostream> #include<algorithm> #include<cstring> using namespace std ; ; int n,v,m; int f[N][N]; int main() { cin>>n>>v>>m; ;i<n;i++) { int a,b,c; cin>>a>>b>>c; for(int j=v;j>=a;j--) for(…
#include <iostream> #include <algorithm> using namespace std; ; int n, m; int v[N][N], w[N][N], s[N]; int f[N]; int main() { cin >> n >> m; ; i <= n; i ++ ) { cin >> s[i]; ; j < s[i]; j ++ ) cin >> v[i][j] >>…
//二进制优化 最后变为01背包 #include <iostream> #include <algorithm> using namespace std; , M = ; int n, m; int v[N], w[N]; int f[M]; int main() { cin >> n >> m; ; ; i <= n; i ++ ) { int a, b, s; cin >> a >> b >> s; ; whi…
朴素 #include<iostream> #include<algorithm> using namespace std ; ; int n,m; int v[N],w[N]; int f[N][N]; int main() { cin>>n>>m;//n个物品 最大体积位m ; i<=n; i++) cin>>v[i]>>w[i]; ; i<=n; i++) ; j<=m; j++) ; k*v[i]<=j…
朴素 数据范围小 //数据范围小 #include<iostream> #include<algorithm> using namespace std ; ; int n,m; int v[N],w[N],s[N]; int f[N][N]; int main() { cin>>n>>m; ; i<=n; i++) cin>>v[i]>>w[i]>>s[i]; ; i<=n; i++) ; j<=m; j…
朴素 //朴素二维 #include <iostream> #include <algorithm> using namespace std; ; int n, m; int v[N], w[N]; int f[N][N]; int main() { cin >> n >> m; ; i <= n; i ++ ) cin >> v[i] >> w[i]; ; i<=n; i++)//装的个数 ; j<=m; j++)…
多重背包 有 n种物品 一共有 m大小的背包,每种物品的价值 大小 个数 为 s[i],v[i],num[i]; #include<bits/stdc++.h>//cmhao #define N 100000 using namespace std; int a[N]; int n,m,cut; int s[N],v[N]; void change(int tj,int jz,int sl) { int q=1,x,y; while(sl) { if(sl%2) { cut++; x=tj*q…
1 # include<iostream> 2 # include<cstring> 3 # include<algorithm> 4 using namespace std; 5 const int N = 110; 6 7 int e[N], ne[N], idx; 8 int h[N]; 9 int v[N], val[N]; 10 int n, m; 11 int f[N][N]; 12 13 void add(int a, int b) { 14 e[idx]…
参考<挑战程序设计竞赛>p51 https://www.cnblogs.com/Ymir-TaoMee/p/9419377.html 01背包问题 问题描述:有n个重量和价值分别为wi.vi的物品,从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值. input: 45 2 3 1 2 3 4 2 2 output: 7(选择第0.1. 3号物品) 朴素解法: c++版: #include <iostream> using namespace std; int…
Description On January 1st 2002, The Netherlands, and several other European countries abandoned their national currency in favour of the Euro. This changed the ease of paying, and not just internationally. A student buying a 68 guilder book before J…
摘要: 使用动态规划法求解0/1背包问题. 难度: 初级 0/1背包问题的动态规划法求解,前人之述备矣,这里所做的工作,不过是自己根据理解实现了一遍,主要目的还是锻炼思维和编程能力,同时,也是为了增进对动态规划法机制的理解和掌握. 值得提及的一个问题是,在用 JAVA 实现时, 是按算法模型建模,还是用对象模型建模呢? 如果用算法模型,那么 背包的值.重量就直接存入二个数组里:如果用对象模型,则要对背包以及背包问题进行对象建模.思来想去,还是采用了对象模型,尽管心里感觉算法模型似乎更好一些.有时…
题目:硬币找零 题目介绍:现在有面值1.3.5元三种硬币无限个,问组成n元的硬币的最小数目? 分析:现在假设n=10,画出状态分布图: 硬币编号 硬币面值p 1 1 2 3 3 5 编号i/n总数j 0 1 2 3 4 5 6 7 8 9 10 1 0 1 2 3 4 5 6 7 8 9 10 2 0 1 2 1 2 3 2 3 4 3 4 3 0 1 2 1 2 1 2 3 2 3 2 设所需硬币最小数目为m,则可以看出m[ i ][  j ]=m[ i-1 ][  j-k*p[ i ]] +…
题目描述 Description 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从银行拿回最少的硬币数,并保证能用这些硬币发工资. 我们应该注意到,人民币的硬币系统是100,50,20,10,5,2,1,0.5,0.2,0.1,0.05,0.02,0.01 元,采用这些硬币我们可以对任何一个工资数用贪心算法求出其最少硬币数.但不幸的是:我们可能没有这样一种好的硬币系统,因此用贪心算法不能求出最少的硬币数,甚至有些金钱总数还不能用这些硬币…
Watch The Movie Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 7811    Accepted Submission(s): 2496 Problem Description New semester is coming, and DuoDuo has to go to school tomorrow. She dec…
解题心得: 这题就是一个简单的0-1背包问题,只不过加了一系列的限制.可以想办法消去限制,直接转换成0-1背包问题的模板形式. 需要注意的几个点:首先对于剩余的5元钱的处理可以直接在总的钱数上将5减去,然后处理大于零的(将特殊化为一般),需要排一个序,方便操作.第二点,最后得出的答案应该是大于5的(之前减了5),所以最后的答案减去一个最大的数就是最小的结果. 主要运用的是一个贪心的思想,将最贵的那个菜去掉和总金额减去5然后再动态规划,规划完毕之后在加上5减去最贵的那个菜就是余额显示最小的结果.…
                                         从零讲JAVA ,给你一条 清晰地学习道路!该学什么就学什么! 1.计算机基础: 1.1数据机构基础: 主要学习:1.向量,链表,栈,队列和堆,词典.熟悉2.树,二叉搜索树.熟悉3.图,有向图,无向图,基本概念4.二叉搜索A,B,C类熟练,9大排序熟悉.5.树的前中后,层次,之字,最短路.6.KMP等字符串算法. 1.2操作系统: 主要学习:1.进程,线程,进程线程区别.进程间通信2.进程调度算法理解3.存储,虚拟…
week1 Google KickStart 2019 A轮 讲解视频地址AcWing 549. 训练   tag: 排序 遍历 在线练习地址AcWing 550. 包裹       在线练习地址AcWing 551. 抢票       在线练习地址 week2 腾讯2019 暑期实习提前批笔试  讲解视频地址AcWing 567. 硬币  在线练习地址AcWing 568. 奇妙的数列  在线练习地址AcWing 569. 猜拳游戏  在线练习地址AcWing 570. 气球游戏 在线练习地址…
题目:https://www.acwing.com/problem/content/316/ 题意:求一个最长单调递减子序列,然后并且求方案数,如果序列完全一样就不要了 思路:我们肯定时修改LIS,我们在求得当前结尾得最长长度后,我们遍历前面是否有和当前数相等得数,如果有就把他的长度清零,避免重复方案数,然后我们再用一个数组记录以当前结尾得方案数有多少个 #include<bits/stdc++.h> #define maxn 100005 #define mod 1000000007 usi…
题面 100 注意到ban的只会是一个子树,所以我们把原树转化为dfs序列. 然后题目就转化为,询问一段ban的区间,之后的背包问题. 比赛的时候,我想到这里,于是就开始想区间合并,于是搞了线段树合并,遂无果,爆零. 由于ban的是一段区间,所以肯定是将前缀和后缀合并. 我们预处理出前缀背包,和后缀背包. 然后合并两个背包就可以了. 具体的合并,Two pointers. 还要卡常. Code #include<iostream> #include<cstdio> #include…
https://www.acwing.com/problem/content/794/ #include<bits/stdc++.h> using namespace std; //判断是否有a>=b 如果是 返回true 反之 返回false bool cmp(vector<int>&A,vector<int>&B) { //先判断位数 if(A.size()!=B.size()) return A.size()>B.size(); //位…