Tyche 2147 旅行

Posted rlt1296

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tyche 2147 旅行相关的知识,希望对你有一定的参考价值。

题目描述

 

你有m元钱,将要游览n个国家。每一个国家有一种商品,其中第i个国家商品的单价为ai元。每到一个国家,你会用手上的钱疯狂购买这个国家的商品,直到剩余的钱无法购买为止。

现在你要决定游览这n个国家的顺序,使得游览完n个国家后剩余的钱最多。

 

输入描述

 

输入包含两行。

第一行两个整数n和m,表示国家数和钱数。

第二行n个整数分别为每个国家商品的单价。

 

输出描述

 

一行一个整数,表示最多剩余多少元钱。

 

样例输入

 

3 31
5 7 11

 

样例输出

 

4

 

注释

 

1≤n≤1000,1≤m≤5000,1≤ai≤1000000000

 

解题思路

第一遍看题以为是贪心,只想到了排序,但是不知道该如何最优。

考试结束之后得知正解是dp后,我慌了。(其实看数据范围明显是dp

考虑dp[i][j]表示m取模前i个数得到j是否可行,有两种转移。

1 a[i]不选dp[i][j]|=dp[i-1][j]

2 a[i]选 dp[i][j%a[i]]|=dp[i-1][j]

初态dp[0][m]=dp[0][0]=1

终态在所有dp[n][j]==1中选最大的j%a[n]

dp是学不会的,这辈子都不可能。

 

技术分享图片
 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstdio>
 4 using namespace std;
 5 const int N=1005;
 6 int n,m,ans,f[N][5*N],a[N];//f[i][j]表示m取模前i个数得到j是否可行 
 7 bool cmp(int c,int d)
 8 {
 9     return c>d;
10 }
11 int main()
12 {
13     scanf("%d%d",&n,&m);
14     for(int i=1;i<=n;i++)
15         scanf("%d",a+i);
16     sort(a+1,a+n+1,cmp);
17     f[0][m]=1,f[0][0]=1;
18     for(int i=1;i<=n;i++)
19         for(int j=0;j<=m;j++)
20         {
21             f[i][j]=f[i-1][j];
22             f[i][j%a[i]]|=f[i-1][j];
23         }
24     for(int i=0;i<=m;i++)
25         if(f[n][i])
26             ans=max(ans,i%a[n]);
27     printf("%d
",ans);
28     return 0;
29 }
View Code

 

以上是关于Tyche 2147 旅行的主要内容,如果未能解决你的问题,请参考以下文章

缺陷检测基于matlab AlexNet和SVM异常螺母检测含Matlab源码 2147期

HDU 2147--HDU 2147(博弈)--我可能做了假题。。。

hdu 2147 kiki's game

P2147 [SDOI2008]洞穴勘测

WUST Online Judge - 2147: 与时间赛跑

fzu2147_A-B Game