F. Shovels Shop 背包DP
题意:
商店里有n把铲子 每个铲子有其标价
一个人要买k吧
有m个优惠政策
每个优惠政策有两个元素x,y
表示 正好买x个铲子的时候 这x个铲子中最便宜的y个铲子免单
求用最少的前买到k个铲子
显然 将n个铲子升序排序好 取前k个 剩下的和本题无关!!
然后前缀和 方便求区间的价值和
要求最少的钱 其实可以转化为求最大的优惠数额
到这一步大致可以看出是一个背包问题了
每个优惠政策可以无限次使用 所以是一个完全背包
即使每次价值都随着容量改变 也可以用背包法来做
#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define REP(i,N) for(int i=0;i<(N);i++)
#define CLR(A,v) memset(A,v,sizeof A)
//////////////////////////////////
#define inf 0x3f3f3f3f
#define N 200000+5 int a[N];
ll dp[N];
ll sum[N];
int v[N];
int c[N]; int main()
{
int n,m,k;
RIII(n,m,k);
rep(i,,n)
RI(a[i]);
sort(a+,a++n); rep(i,,n)
sum[i]=sum[i-]+a[i];
rep(i,,m)
RII(v[i],c[i]); rep(j,,k)
rep(i,,m)
if(j>=v[i])
dp[j]=max(dp[j],dp[j-v[i]]+sum[j-v[i]+c[i]]-sum[j-v[i]]);
cout<<sum[k]-dp[k]; return ;
}
将背包的两个for循环顺序交换一下就会wa ?因为这种顺序是只取只取一个 (优惠一次一次只能用一种) 为分组背包!
更加简便的题解:
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
const int maxn=2e5+;
const int maxk=2e3+; int n,m,k;
int a[maxn],s[maxn];
int g[maxk];
int f[maxk]; int main()
{
cin>>n>>m>>k;
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=,x,y;i<=m;i++)
{
scanf("%d%d",&x,&y);
if(x<=k) g[x]=max(g[x],y);
}
sort(a+,a+n+);
for(int i=;i<=k;i++) s[i]=s[i-]+a[i];
for(int i=;i<=k;i++)
{
f[i]=;
for(int j=;j<i;j++)
f[i]=max(f[i],f[j]+s[j+g[i-j]]-s[j]);
}
cout<<s[k]-f[k]<<endl;
}
F. Shovels Shop 背包DP的更多相关文章
- Codeforces Round #552 (Div. 3) F. Shovels Shop(dp)
题目链接 大意:给你n个物品和m种优惠方式,让你买k种,问最少多少钱. 思路:考虑dpdpdp,dp[x]dp[x]dp[x]表示买xxx种物品的最少花费,然后遍历mmm种优惠方式就行转移就好了. # ...
- CF F. Shovels Shop(前缀和预处理+贪心+dp)
F. Shovels Shop time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- Codeforces Round #552 (Div. 3) F. Shovels Shop (前缀和预处理+贪心+dp)
题目:http://codeforces.com/contest/1154/problem/F 题意:给你n个商品,然后还有m个特价活动,你买满x件就把你当前的x件中最便宜的y件价格免费,问你买k件花 ...
- codeforces#1154F. Shovels Shop (dp)
题目链接: http://codeforces.com/contest/1154/problem/F 题意: 有$n$个物品,$m$条优惠 每个优惠的格式是,买$x_i$个物品,最便宜的$y_i$个物 ...
- cf F. Shovels Shop
https://codeforces.com/contest/1154/problem/F 给定m个折扣 每个折扣的{x,y}的意思是每次购买如果买到确切的x只铲子就其中的最便宜的y只铲子免付: 先贪 ...
- Vijos1392拼拼图的小衫[背包DP|二维信息DP]
背景 小杉的幻想来到了经典日剧<死亡拼图>的场景里……被歹徒威胁,他正在寻找拼图(-.-干嘛幻想这么郁闷的场景……). 突然广播又响了起来,歹徒竟然又有了新的指示. 小杉身为新一代的汤浅, ...
- 背包dp整理
01背包 动态规划是一种高效的算法.在数学和计算机科学中,是一种将复杂问题的分成多个简单的小问题思想 ---- 分而治之.因此我们使用动态规划的时候,原问题必须是重叠的子问题.运用动态规划设计的算法比 ...
- BZOJ 1042 硬币购物(完全背包+DP)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1042 题意:给出四种面值的硬币c1,c2,c3,c4.n个询问.每次询问用d1.d2.d ...
- hdu 5534 Partial Tree 背包DP
Partial Tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...
随机推荐
- PHP中empty,isset,is_null的区别
isset 判断变量是否已存在 empty 判断变量是否为空或为0 is_null 判断变量是否为NULL 仅作为记录使用. 参考链接:http://www.jb51.net/article/6903 ...
- 在v-html中,js 正则表达式清除字符串里的style属性
项目中遇到这样的需求,后端返回的是字符串,在vue用v-html显示,里面有style样式,要去除style 在v-html中使用filters,和平时的不一样,推荐项目的方法,定义一个全局的过滤方法 ...
- jemter 新增sha256函数
1 https://blog.csdn.net/y100100/article/details/80701049 2 https://blog.csdn.net/y100100/article/d ...
- Modbus库开发笔记之四:Modbus TCP Client开发
这一次我们封装Modbus TCP Client应用.同样的我们也不是做具体的应用,而是实现TCP客户端的基本功能.我们将TCP客户端的功能封装为函数,以便在开发具体应用时调用. 对于TCP客户端我们 ...
- JS实现图片放大查看
示例:https://wumaozheng.com/static-pages/image-magnifier.html <!DOCTYPE html> <html> <h ...
- android入门小结一
一 Android入门基础:从这里开始 gradle介绍: Android Studio使用Gradle 编译运行Android工程. 工程的每个模块以及整个工程都有一个build.gradle文件. ...
- MySql在windows上的安装
知乎安装教程 csdn安装教程 一.官网下载 ZIP Archive 内的软件包,mysql-xxx-win64.zip. 二.新建 MySQL 文件夹,解压缩下载包,进入文件夹(mysql-8.0. ...
- java源代码
//信1705-1 20173527 刘津鑫 package money; import java.io.IOException; import java.io.Serializable; impor ...
- Java 画一个5X5的方形矩阵
效果图如下: 思路:创建一个窗口,使其居中于屏幕中央,使用drawRect(x, y, width, height)画正方形. import java.awt.Graphics; import jav ...
- MySQL源码安装一键脚本
#红色部分根据自己的需求来定义#!/bin/bash #卸载系统自带的Mysql /bin/rpm -e $(/bin/rpm -qa | grep mysql|xargs) --nodeps /bi ...