首页 > NOIP模拟题——B

NOIP模拟题——B

【题目描述】

我们要从n种食物选m个出来,安排一个顺序吃掉它(们),每种食物有个美味值ai,然后我们有k个规则,每个规则有 xi, yi 和 ci三个数,如果吃完第xi种食物接下来马上吃第yi种食物,第j种食物的美味值会增加ci。每种食物至多吃一个,求美味值最大的和是多少?

【输入格式】

第一行有三个数n,m,k,k代表有k个规则(0<=k<=n*(n-1))。

第二行有n个数字代表每个食物的美味值。

接下去有k行,每行三个数xi,yi,ci。保证没有任意两个规则的xi和yi同时相同。

【输出格式】

一行一个数代表答案

【sample input1】

2 2 1

1 1

2 1 1

【sample output1】

3

【sample input 2】

4 3 2

1 2 3 4

2 1 5

3 4 2

【sample output 2】

12

【数据范围】

30% m<=n<=5 ,0<=ci,ai<=1e5

100% m<=n<=18,0<=ci,ai<=1e9

 

由于数据小,找的多,所以考虑状压DP。f[i][j]表示i状态时最后一个数为j的最大值,若没有吃完则每次找还未吃掉的和吃掉的(看做是当前状态最后一个吃掉的),若吃多了就continue,否则(找完m个了)找dp[i][j]的最大值。

 

 1 #include
 2 #include
 3 #include
 4 #include
 5 using namespace std;
 6 const long long maxn=20;
 7 long long dp[(1<<maxn)][maxn];
 8 long long v[maxn];
 9 long long pp[maxn][maxn];
10 long long n,m,k;
11 long long max(long long x,long long y)
12 {
13     if(xreturn y;
14     return x;
15 }
16 long long _count(long long x)
17 {
18     long long an=0;
19     while(x)
20     {            
21         if(x&1)an++;
22         x>>=1;
23     }
24     return an;
25 }
26 int main()
27 {
28     freopen("b.in","r",stdin);
29     freopen("b.out","w",stdout);
30     scanf("%I64d%I64d%I64d",&n,&m,&k);
31     for(int i=0;i<=n-1;i++)
32     scanf("%I64d",&v[i]);
33     for(int i=1;i<=k;i++)
34     {
35         int x,y;long long z;
36         scanf("%d%d%I64d",&x,&y,&z);
37         pp[x-1][y-1]=z;
38     }
39     long long ans=0;
40     for(int i=0;i<=n-1;i++)
41     dp[(1<v[i];
42     for(int i=0;i<(1<)
43     {
44         int qw=_count(i);
45         if(qw>m)continue;
46         if(qw==m)
47         {
48             for(int j=0;j<=n-1;j++)
49             ans=max(ans,dp[i][j]);
50             continue;        
51         }
52         else
53         {
54             for(int j=0;j<=n-1;j++)//枚举没有吃的
55             {
56                 if(((1<0)//没有吃
57                 {
58                     for(int k=0;k<=n-1;k++)//枚举最后吃的点
59                     if(((1<//吃过 
60                     dp[i|(1<1<<j)][j]);
61                 } 
62             }
63             
64         }
65     }
66     printf("%I64d",ans);
67     return 0;
68 }

 

转载于:https://www.cnblogs.com/937337156Zhang/p/6051322.html

更多相关:

  • Gym - 102082Ghttps://vjudge.net/problem/2198225/origin对于数列中任意一个数,要么从最左边到它不递减,要么从最右边到到它不递减,为了满足这个条件,就要移动,而移动的最少步数就是逆序对数。所以这个数要么往左移动,要么往右移动,所以两个取最小就好了 #include

  • 雪花算法根据时间戳生成有序的 64 bit 的 Long 类型的唯一 ID 各 bit 含义: 1 bit: 符号位,0 是正数 1 是负数, ID 为正数,所以恒取 041 bit: 时间差,我们可以选择一个参考点,用它来计算与当前时间的时间差 (毫秒数),41 bit 存储时间差,足够使用 69 年10 bit: 机器码,能编...

  •   这是一篇很水的blog 扫雷 link 一道很水的dp,考虑上一上,这一行,与下一行是否有雷即可 #include #include #include #include using namespace std; inline long long read...

  • 题目链接:http://codeforces.com/problemset/problem/900/D 题意:   给定x,y,问你有多少个数列a满足gcd(a[i]) = x 且 ∑(a[i]) = y。   题解:   由于gcd(a[i]) = x,所以y一定是x的倍数,否则无解。   那么原题就等价于:问你有多少个数列a满足g...

  • P2429 制杖题 题目描述 求不大于 m 的、 质因数集与给定质数集有交集的自然数之和。 输入输出格式 输入格式:第一行二个整数 n,m。 第二行 n 个整数,表示质数集内的元素 p[i]。 输出格式:一个整数,表示答案,对 376544743 取模。 输入输出样例 输入样例#1:2 15 3 5 输出样例#1:60 说...

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...

  • 用python编写乘法口诀表的方法 发布时间:2020-08-25 11:46:35 来源:亿速云 阅读:60 作者:小新 用python编写乘法口诀表的方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧! 第一种:使用for遍历循环嵌套for x in...

  • //很长一段时间我都只使用以下方式做数组循环,具体原因看数据 var aa = for (var i = 0, l = aa.length; i < l; i++) { var a = aa[i];} 数据采集图片来源于网友 很明显,for循环第二种方式完胜!!! 至于for in、forEach什么的,不知道甩他们多少...

  • 目录 1. Scene Graph Generation with External Knowledge and Image Reconstruction 2. Knowledge Acquisition for Visual Question Answering via Iterative Querying Author...

  • 基础题1: 输入一个正整数 n (1≤n≤10)和n 阶方阵a的元素,如果方阵a中的所有元素都沿主对角线对称,输出“Yes”, 否则,输出“No”。主对角线为从矩阵的左上角至右下角的连线,方阵a中的所有元素都沿主对角线对称指对所有i, k,a[i][k]和a[k][i]相等。输入输出示例如下: 输入: 3 1 2 3 4 5 6 7...

  • 程序流程控制 分支 顺序 循环 if switch&case 1 2 3 调整 break 1.6 前 switch(byte、short、char、int) 1.7 可放String 循环 while(次数不确定) do while for(确定次数) break(跳出本层循环) continue(跳出本次循环)     *   2...