51nod1625 夹克爷发红包(贪心+dfs)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1625

在公司年会上,做为互联网巨头51nod掌门人的夹克老爷当然不会放过任何发红包的机会。

现场有n排m列观众,夹克老爷会为每一名观众送出普通现金红包,每个红包内金额随机。

接下来,夹克老爷又送出最多k组高级红包,每高级红包会同时给一排或一列的人派发 ,每高级红包的金额皆为x。

派发高级红包时,普通红包将会强制收回。同时,每个人只能得到一个高级红包。(好小气!)

现在求一种派发高级红包的策略,使得现场观众获得的红包总金额最大。

Input

第一行为n, m, x, k四个整数。

1 <= n <= 10, 1 <= m <= 200
1 <= x <= 10^9,0 <= k <= n + m

接下来为一个n * m的矩阵,代表每个观众获得的普通红包的金额。普通红包的金额取值范围为1 <= y <= 10^9

Output

输出一个整数,代表现场观众能获得的最大红包总金额

Input示例

3 4 1 5
10 5 7 2
10 5 10 8
3 9 5 4

Output示例

78

题目意思就是,一个n*m的矩阵的人,每个人都有一个普通的红包,现在有一种x元的高级红包,有k次机会发高级红包,只能一行或一列发,并且得到高级红包的人将没收普通红包。问最多可以发出去多少红包总金额。(给的样例也是醉了,居然有高级红包还没有普通红包多的)题目思路:有dfs搜索每行要高级红包或者不要的所以情况,在解决列变化的情况。
代码如下:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
ll ans,n,m,x,k;
ll a[15][250],b[15][250],vis[250],all[250];

void solve()
{
    ll used=0;//已经使用了几次高级红包
    for(int i=0;i<n;i++)
        if(vis[i])
            used++;
    for(int i=0;i<n;i++)//记录变化每个人金钱数
        for(int j=0;j<m;j++)
            if(vis[i])//是高级红包就要改变原来的值
                b[i][j]=x;
            else
                b[i][j]=a[i][j];
    ll sum=0;//记录全部总金钱数
    memset(all,0,sizeof(all));//all记录改变后,每列总金钱数
    for(int j=0;j<m;j++)
    {
        for(int i=0;i<n;i++)
        {
            all[j]+=b[i][j];
            sum+=b[i][j];
        }
    }
    int kk=k-used;//剩下的使用高级红包的次数
    sort(all,all+m);//排序,用来查找列金额是否有小于使用高级红包的
    for(int i=0;i<m;i++)
    {
        if(all[i]<n*x&&kk>0)//可以对此时的i列用高级红包
        {
            sum-=all[i];
            sum+=n*x;
            kk--;
        }
    }
    ans=max(ans,sum);//记录最大值
}

void dfs(int h,int sum)
{
    if(sum>k)//超过k次
        return ;
    if(h==n)//行数都考虑完了
        solve();
    else
    {
        vis[h]=1;//当前h行要高级红包
        dfs(h+1,sum+1);
        vis[h]=0;//不要高级红包
        dfs(h+1,sum);
    }
}
int main()
{
    scanf("%lld%lld%lld%lld",&n,&m,&x,&k);
    memset(vis,0,sizeof(vis));
    ans=0;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            scanf("%lld",&a[i][j]);
    dfs(0,0);
    printf("%lld\n",ans);
    return 0;
}



原文地址:https://www.cnblogs.com/xiongtao/p/9280536.html

时间: 2024-08-24 06:57:50

51nod1625 夹克爷发红包(贪心+dfs)的相关文章

PHP实现发红包程序

我们先来分析下规律. 设定总金额为10元,有N个人随机领取: N=1 第一个 则红包金额=X元: N=2 第二个 为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数. 第二个红包=10-第一个红包金额: N=3 第三个 红包1=0.01至9.99之间的某个随机数 红包2=0.01至(10-红包1-0.01)的某个随机数 红包3=10-红包1-红包2 -- 于是我们得到一个规律,在分配当前红包金额时,先预留剩余红白所需最少金额,然后在0.01至总金额-预留金额间取随机

UVA 10317 - Equating Equations 贪心 dfs

UVA 10317 - Equating Equations 贪心 dfs ACM 题目地址:UVA 10317 - Equating Equations 题意: 给一个等式,但是这个等式不一定是正确的,要你对等式中的数字重新排序,使得等式成立.等式只有+和-,数字个数小于16. 分析: 以a + b - c = d - e为例子. 1. 我们把等式右边的各项都换到左边,a + b - c - d + e = 0 2. 把+项和-项放一起,就变成(a + b + e) - (c + d) = 0

发红包营销,东鹏特饮是这样玩的

如今一物一码的天下,也是消费者的天下,如何绑定客户的粘性,就得要抓住消费者心理,综上所述,红包是最好的兴奋剂.企业营销就从这开始了.如上有一些大品牌就早先做起了这个活动,效果那是非常好,中小企业也应该跟上趋势,才能提高市场竞争力,达到营销的好效果.微信扫一扫摇红包系统.商品二维码扫一扫摇红包软件开发.酒品扫一扫领红包系统开发.酒品扫码关注领红包软件开发.酒品扫码分享领红包软件开发.酒品扫码数钱红包系统.饮料扫码关注领红包系统.快消品扫一扫摇红包系统开发咨询潘经理188-2518-9707(tel

js 发红包

<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>无标题文档</title> <script> window.onload = function (){ var oBtn = $('btn'); var num = $('nu

小黑的镇魂曲(HDU2155:贪心+dfs+奇葩解法)

题目:点这里 题目的意思跟所谓的是英雄就下100层一个意思--在T秒内能够下到地面,就可以了(还有一个板与板之间不能超过H高). 接触这题目是在昨晚的训练赛,当时拍拍地打了个贪心+dfs,果断跟我想的一模一样,TLE了. 赛后我在宿舍里修改了好几次--均无果.后来,我大胆地假设,估计是最后两组出问题TLE的..于是我就在程序里,指定在最后两组输出yes或者no,就这样奇葩地AC了-- 我实验了三次,总共有2*2种可能--(差点就觉得人品差到不行了) 终于AC了.当然,平时练习真心不要这样子,但是

php发红包

?/** * 发红包函数实现 * @param float $total    红包金额 * @param int $num        红包个数 * @return  返回数组 */function luckymoney($total,$num){    $min=0.01;//每个人最少能收到0.01元    $arr[]=array() ;    for ($i=0;$i<$num-1;$i++)    {        $safe_total=($total-($num-$i)*$mi

使用PHP编写发红包程序

使用PHP编写发红包程序 http://www.jb51.net/article/69815.htm 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2015-07-22 微信发红包是最近非常火的一件事情,大家或多或少的都发过或者收到过红包,那么下面来看一个我们在生活中常碰到的一个php实现微信红包的程序算法,希望这个程序对各位做微信开的朋友会带来帮助. 使用PHP发红包,当我们输入红包数量和总金额后,PHP会根据这两个值进行随机分配每个金额,保证每个人都能领取到一个红包,每个红

支付宝商家红包发红包步骤

https://hb.alipay.com/登陆商家支付宝账号 便看到 发红包 和 红包管理 输入必要的信息 商家们赶紧发起来吧.互联网公司也可以.只要有企业支付宝账号即可.

网络支付发红包将实名认证

最近几个月,您用微信“零钱”.支付宝“余额”发红包.转账.打车付款.超市结账的话,说不定页面就会出现个弹窗,提示您绑定银行卡.手机号……别嫌麻烦,这是支付平台在进行实名认证. 去年12月份,央行公布了<非银行支付机构网络支付业务管理办法>(以下简称“办法”),将个人网络支付账户分为三类,升级账户需追加认证.该办法将于 7月1日正式生效.距离“大限”还有3个月,支付宝.微信等支付平台近日接连发布声明,称将帮助用户完善账户信息,进行相关升级操作. 值得注意的是,如果7月1日之后您还未进行相关实名认