abcd

【问题描述】
有4个长度为N的数组a,b,c,d。现在需要你选择N个数构成数组e,数组e满足
a[i]≤e[i]≤b[i]以及 Σe[i]*c[i]=0,并且使得Σe[i]*d[i]最大。
【输入格式】
输入文件名为abcd.in。
输入文件共 N+1 行。
第 1 行包含1个正整数N。
第 i+1 行包含4个整数a[i],b[i],c[i],d[i]。
【输出格式】
输出文件名为abcd.out。
输出共1行,包含1个整数,表示所给出公式的最大值。输入数据保证一定有解。
【输入输出样例1 1 】
abcd.in 
5
-1 1 2 5
-2 2 1 2
0 1 1 3
-2 -1 3 10
-2 2 3 9

abcd.out
2
【输入输出样例2 2 】
abcd.in 
10
1 10 1 7
-10 10 2 0
-10 10 2 2
-10 10 2 0
1 10 1 0
-10 10 2 0

10 10 2 0

1 10 1 0
-10 10 2 0
1 10 1 0

abcd.out
90
【输入输出样例3 3 】
abcd.in 
10
1 10 1 0
-10 10 2 2
-10 10 2 2
-10 10 2 2
1 10 1 0
-10 10 2 2
-10 10 2 2
1 10 1 0
-10 10 2 2
1 10 1 0

abcd.out
-4
【数据规模与约定】
对于 20%的数据,N≤10,-2≤a[i]<b[i]≤2;
对于 60%的数据,N≤50, -20≤a[i]<b[i]≤20;
对于 100%的数据,
N≤200,-25≤a[i]<b[i]≤25,1≤c[i]≤20,0≤d[i] ≤10000

/*
  这类似于一个多重背包的问题,给出n个物品,每个物品可以选a[i]到b[i]件,体积为c[i],价值为d[i], 然后问恰好填满一个容量为0的背包的最大价值。
  对于这个问题,我们可以把范围转换成0~b[i]-a[i],那么选的件数就成了e[i]-a[i],那么背包的体积就成了-a[i]*c[i],价值是(e[i]-a[i])*d[i]+Σa[i]*d[i]。
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#define N 210
using namespace std;
int a[N],b[N],c[N],d[N],n,m;
int f[N*30],w[N],v[N],num,ans;
void init(int ss,int ww,int vv)
{
    for(int i=1;i<=ss;i*=2)
    {
        w[++num]=ww*i;v[num]=vv*i;
        ss-=i;
    }
    if(ss){w[++num]=ss*ww;v[num]=ss*vv;}
}
int main()
{
    memset(f,-127/3,sizeof(f));f[0]=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
        b[i]-=a[i];ans+=a[i]*d[i];m-=a[i]*c[i];
    }
    for(int i=1;i<=n;i++)
      init(b[i],c[i],d[i]);
    for(int i=1;i<=num;i++)
      for(int j=m;j>=w[i];j--)
        f[j]=max(f[j-w[i]]+v[i],f[j]);
    printf("%d",f[m]+ans);
    return 0;
}
时间: 2024-11-05 11:19:47

abcd的相关文章

Ubuntu vim “上下左右键”变“ABCD”的解决办法

Ubuntu中使用vim编辑器在编辑模式下使用上下左右键会变成字母ABCD,使用HJKL键又会变成上下左右. 这是由于Ubuntu预装的是vim tiny版本,而需要的是vim full版本.执行下面的语句先卸载之前的版本然后安装vim full版本: $ sudo apt-get remove vim-common $ sudo apt-get install vim 卸载过程: 安装过程: .

教学目标的表述方式──行为目标的ABCD表述法

教学目标应规定学生在教学活动结束后能表现出什么样的学业行为,并限定学生学习过程中知识.技能的获得和情感态度发展的层次.范围.方式及变化效果的量度.对每节课教学目标的准确表述,可以充分发挥教学目标在教学活动中的指向.评估和激励作用.表述教学目标时一般要慎重考虑以下四个因素. 1.行为主体.根据新课程的有关理念,在编写教学目标时,无论是一般的行为目标或是具体的行为目标,在描写时都应写成学生的学习行为而不是教师的教学行为,一般不用来描述教师的教学程序或活动的安排,如“使学生……”“让学生……”“提高学

Arcgis for javascript实现百度地图ABCD marker的效果

概述: 在我的博客中,有一篇相关的文章,这段时间,有很多人问我求源码,只是时间过去已长,源代码已找不到,乘着这个9.3放假,又重新实现了下,并相关代码做了优化,在此贴出来,方便大家使用. 相关文章地址: http://blog.csdn.net/gisshixisheng/article/details/39577817 实现后效果: 为直观期间,先贴出来我做的效果 列表展示和地图展示以及联动 显示信息 实现思路: 1.列表与地图的互动 鼠标经过列表时,修改列表图标,并根据列表返回的值在地图上绘

Google面试题—有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD

分类: windows编程 C++ 2012-10-27 19:56 3410人阅读 评论(1) 收藏 举报 有四个线程1.2.3.4.线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD.初始都为空.现要让四 个文件呈如下格式:A:1 2 3 4 1 2....B:2 3 4 1 2 3....C:3 4 1 2 3 4....D:4 1 2 3 4 1....请设计程序. [cpp] view plaincopy #include <stdio.h

关于 int.parse(&quot;abcd&quot;) 出错的问题分析及解决方案

问题分析: 首先,int.Parse()是一种类容转换,表示将数字内容的字符串转为int类型.该函数要求被操作的字符串由数字组成,因此存在三种可能的输入异常情况: 1. 如果字符串为空,则抛出ArgumentNullException异常: 2. 如果字符串内容不是数字,则抛出FormatException异常: 3. 如果字符串内容所表示数字超出int类型可表示的范围,则抛出OverflowException异常: 所以 int.parse("abcd") 出错原因在于字符串的内容不

算法练习--ABCD*E=DCBA

//1.ABCD * E = DBCA//2.A,B,C,D {0-9} , E {1-9}//3.A,B,C,D,E all different var existSameN = function (arr){ for(var i = 0; i < arr.length; i++){ for(var j = 0; j < arr.length ; j++){ if(j == i){continue;} if(arr[i] == arr[j]) {return true;} } } retur

ubuntu linux vi编辑模式下按方向键会变成ABCD,

最近从redhat9.0换到了ubuntu 12.04.3,发现secureCRT端在vi编辑模式下按方向键会变成ABCD, 找到了此解决办法: ubuntu下 vi输入方向键会变成ABCD,这是ubuntu预装的是vim tiny版本,安装vim full版本即可解决. 先卸载vim-tiny: $ sudo apt-get remove vim-common 再安装vim full: $ sudo apt-get install vim OK,恢复正常了. 方法是在这片文章中找到的

这是递归和回溯的算法 是abcd&#39;的排列可能

#include<stdio.h>#include<iomanip>#include<iostream>using namespace std;bool b[10]={0};int a[10]={0};int print(){ for (int i=1;i<=4;i++) printf("%c ",a[i]); printf("\n");} int dosomething(int z){ int mm; for ( mm=1

获取listboxitem在ListBox中的index并转换成abcd

原文 获取listboxitem在ListBox中的index并转换成abcd 截图如下: 1.实现Converter  获取到listbox,并得到listitem在listbox中的index public class ItemContainerToZIndexConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globaliza

char str[] = {&quot;abcd&quot;}和 char* str = {&quot;abcd&quot;}的区别

char str[] = {"abcd"}和 char* str = {"abcd"}的区别 char* get_str(void) { char str[] = {"abcd"}; return str; } char str[] = {"abcd"};定义了一个局部字符数组,尽管是数组,但它是一个局部变量,返回它的地址肯定是一个已经释放了的空间的地址. 此函数返回的是内部一个局部字符数组str的地址, 且函数调用完毕后 此