[SCU 4515] 又见背包 (可行性背包DP)

2024-06-21 19:58
文章标签 背包 scu 4515 dp 可行性

本文主要是介绍[SCU 4515] 又见背包 (可行性背包DP),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SCU - 4515

有 N个大小不同的数字,第 i种数字为 a_i,每种有 m_i个
求问能否从中选出若干个数字,使他们的和为 K


背包九讲 2.0的例题,用多重背包的二进制能过
根据 lyb dalao所述
因为 K<1e5 ,所以其实最后用到的物品数量不会超过 1e5
所以 mi=min(mi,K/ai) ,所以用二进制优化能过

背包九讲上的做法如下:
dp[ i ][ j ] 表示前 i个物品,组成背包容量为 j时,
所剩下的最多第 i个物品的数量,不能到达的状态设为 -1
然后检查能否转移到 dp[ N ][ K ]即可

#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std;
typedef pair<int,int> Pii;
typedef long long LL;
typedef unsigned long long ULL;
typedef double DBL;
typedef long double LDBL;
#define MST(a,b) memset(a,b,sizeof(a))
#define CLR(a) MST(a,0)
#define Sqr(a) (a*a)const int maxk=1e5+10;
int N,K;
int W[110],M[110];
int dp[2][maxk];int main()
{#ifdef LOCALfreopen("in.txt", "r", stdin);
//  freopen("out.txt", "w", stdout);#endifint T;scanf("%d", &T);for(int ck=1; ck<=T; ck++){scanf("%d%d", &N, &K);MST(dp,-1);dp[0][0]=0;for(int i=1; i<=N; i++) scanf("%d", &W[i]);for(int i=1; i<=N; i++) scanf("%d", &M[i]);for(int i=1; i<=N; i++){int cur=i&1,las=(i-1)&1;MST(dp[cur],-1);for(int j=0; j<maxk; j++) if(~dp[las][j]) dp[cur][j]=M[i];for(int j=0; j<maxk-W[i]; j++){if(dp[cur][j]>0){dp[cur][j+W[i]]=max(dp[cur][j+W[i]], dp[cur][j]-1);}}}if(~dp[N&1][K]) printf("yes");else printf("no");if(ck<T) puts("");}return 0;
}

这篇关于[SCU 4515] 又见背包 (可行性背包DP)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

上海邀请赛 A题目 HDU 5236(dp)

先求出没有ctrl+s的时候构造长度为i的期望f[i] 。然后枚举保存的次数,求出最小即可。 #include<cstdio>#include<cstdio>#include<cmath>#include<queue>#include<stack>#include<string>#include<cstring>#include<iostream>#include<map>

poj 3160 Father Christmas flymouse 强连通+dp

首先我们可以确定的是,对于val值小于0的节点都变成0.   假设一个集合内2个房间都能任意到达,那么我就可以吧集合内的所有点的价值都取到,并且可以达到任一点。实际上集合内的每个点是相同的,这样的集合就是一个强连通分量。 那么我们就可以用tarjin算法进行强连通缩点, 最后形成一个dag的图。在dag的图上面进行dp。可以先用拓扑排序后dp。或者建反响边记忆化搜索 。 VIEW

秋招突击——6/22——复习{区间DP——加分二叉树,背包问题——买书}——新作{移除元素、实现strStr()}

文章目录 引言复习区间DP——加分二叉树个人实现 背包问题——买书个人实现参考实现 新作移除元素个人实现参考思路 找出字符串中第一个匹配项的下标个人实现参考实现 总结 引言 今天做了一个噩梦,然后流了一身汗,然后没起来,九点多才起床背书。十点钟才开始把昨天那道题题目过一遍,然后十一点才开始复习题目,为了不耽误下午的时间,所以这里的就单纯做已经做过的题目,主打一个有量,不在学

采药问题 01背包

Description:辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”

动态规划DP--斐波那契数、爬楼梯、使用最小花费爬楼梯等示例代码

动态规划DP 文章目录 动态规划DP509. 斐波那契数70. 爬楼梯746. 使用最小花费爬楼梯62. 不同路径63. 不同路径II343.整数拆分 509. 斐波那契数 509. 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) =

如何用动态规划解决0-1背包问题(C语言实现)

对于一组不同重量、不可分割的物品,我们需要选择一些装入背包,在满足背包最大重量限制前提下,背包中物品总重量的最大值是多少?假设此时是5个物品,2,2,4,6,3,然后背包最大承载两是9. 假如我们使用回溯算法解决该问题, 代码如下 int maxW = 0; //最大重量int n = 5; //物品数目int w = 9; // 背包最大重量int weight[] = {2,2,4,

程序员绩效管理-可行性调研

针对这个市场进行了小范围的可行性调研。因为这个项目一开始就定义为走融资上市的路子,第一步是众筹起步。          总结的结论如下:          1、痛点是真的痛。研发企业对自己团队的开发效率是心知肚明,恨铁不成钢。          2、市场上类似的软件也不少,企业自己也在开发例如工时管理、日报月报等。          3、一般采用开发平台来提高效率(这是另

从网易校招编程题谈起,轻松理解有趣的0-1背包问题

从网易的一道算法题开始 最近在准备春招实习,偶然做到网易的一道编程题,一方面找了很多博客看的云里雾里,这里特别写下解题的思路和逻辑,一方面加深印象,另一方面供需要的你学习参考。好了,话不多说,开始吧。本文提供思路,并给出Java代码实现例子,供大家参考。 先睹为快 来源:网易2017春招笔试真题编程题 时间限制:1秒 空间限制:32768K 一种双核CPU的两个核能够同时的处理任务,现在有

算法学习014 0-1背包问题 c++动态规划算法实现 中小学算法思维学习 信奥算法解析

目录 C++0-1背包 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、运行结果 五、考点分析 六、推荐资料 C++0-1背包 一、题目要求 1、编程实现 有 N 件物品和一个容量为 M的背包,每件物品有各自的价值且只能被选择一次,要求在有限的背包容量下,装入的物品总价值最大。 2、输入输出 输入描述:第一行输入两个整数,分别表示

状态压缩DP——AcWing 291. 蒙德里安的梦想

状态压缩DP 定义 状态压缩DP是一种利用二进制数来表示状态的动态规划算法。它通过将状态压缩成一个整数,从而减少状态数量,提高算法效率。 运用情况 状态压缩DP通常用于解决具有状态转移和最优解性质的问题,例如组合优化、图论、游戏等问题。它的基本思想是将问题的状态表示为一个二进制数,其中每一位表示一个元素或一个状态。通过对二进制数的位运算,可以方便地进行状态转移和最优解的计算。 注意事项