noip 邮票面值设计 - 搜索 - 动态规划
2016-08-28 12:27
501 查看
描述
给定一个信封,最多只允许粘贴N张邮票,计算在给定M(N+M<=10)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大max ,使得1~max之间的每一个邮资值都能得到。例如,N=3,M=2,如果面值分别为1分、4分,则在l分~6分之间的每一个邮资值都能得到(当然还有8分、9分和12分):如果面值分别为1分、3分,则在1分~7分之间的每一个邮资值都能得到。可以验证当N=3,M=2时,7分就是可以得到连续的邮资最大值,所以MAX=7,面值分别为l分、3分。
样例输入:共一行,两个整数,分表为N与M的值。
格式
输入格式
一行,分别为N,M。输出格式
两行。第一行为m种邮票的面值,按升序排列,各数之间用一个空格隔开。
第二行为最大值。
如果有多解,输出字典序最大的一个。
样例1
样例输入1[复制]
3 2
样例输出1[复制]
1 3 MAX=7
限制
各个测试点1s来源
NOIP1999(转自https://vijos.org/p/1179)
这道题首先看数据范围就大概能够猜出是搜索,可是,出现了以下问题
1)搜索的范围,不可能从1搜到1000
2)如何求MAX
先来思考问题二,首先回顾一下求出面值为i所需最少的邮票怎么求,用动规对不对?
f[i] = min(f[i - 面额] + 1, f[i]),这样求的对不对?
那从1一直往下做,求到某个f[i] > n,说明什么?i这个面值不能用要超过n张的邮票
凑出来,故MAX = i - 1
问题二解决了,然后来解决问题一,首先上限,很容易想到,当前的MAX + 1,为什么
不能是MAX + 2,或者更多,因为MAX + 1就凑不出来了。然后来思考下限,前一个面额 + 1?
如果比它少会发生什么?MAX貌似不会改变。所以得到了这个范围[前一个面额 + 1, 当前MAX]
接下来附上代码
Code
/** * vijos.org * Problem#1179 * Accepted * Time:107ms * Memory:568k */ #include<iostream> #include<cstring> #include<cstdio> #include<cstdlib> using namespace std; int buf[45]; int ans[45]; int f[1001]; int n ,k; int maxv = 0; int cale(int count){ if(!count) return 0; memset(f, 0x7f, sizeof(f)); f[0] = 0; int i = 1; do{ for(int j = 1;j <= count && buf[j] <= i;j++) f[i] = min(f[i - buf[j]] + 1, f[i]); }while(f[i++] <= n); return i - 2; } void search(int sec){ if(sec >= k){ int c = cale(k); if(c <= maxv) return; for(int i = 1;i <= k; i++) ans[i] = buf[i]; maxv = c; return; }else{ int temp = cale(sec); for(int i = temp + 1;i > buf[sec]; i--){ buf[sec + 1] = i; search(sec + 1); } } } int main(){ cin >> n >> k; search(0); for(int i = 1;i <= k;i++) cout<<ans[i]<<" "; cout<<endl; cout<<"MAX="<<maxv; return 0; }
相关文章推荐
- 【暴力搜索】【动态规划】[NOIP 1999]邮票面值设计
- noip1999 邮票面值设计 (搜索+完全背包)
- NOIP1999邮票面值设计[搜索|DP]
- NOIP 1999 邮票面值设计 搜索与动归
- NOIP 1999 邮票面值设计 解题报告
- [NOIP1999]邮票面值设计
- 1047 邮票面值设计 1999年NOIP全国联赛提高组
- 【NOIP1999】邮票面值设计
- Vijos P1179 邮票面值设计(动态规划,深搜)
- 【搜索+DP】洛谷P1021邮票面值设计
- 搜索——邮票面值设计
- 水题笔记:codevs1047 邮票面值设计 [搜索]
- 【NOIP1999】邮票面值设计 dfs+dp
- [普及]NOIP 1999 邮票面值设计
- [NOIP1999]邮票面值设计
- [NOIP1999提高] CODEVS 1047 邮票面值设计(dfs+dp)
- 【NOIP1999】邮票面值设计(水题水积分)
- NOIP1999邮票面值设计
- 洛谷 P1021 邮票面值设计-简单搜索+dp
- [NOIP1999]邮票面值设计