https://www.luogu.org/problem/show?pid=2737#sub

先说一个结论:对于两个数p, q,且gcd(p, q) = 1(这个很重要,是条件来的)。他们不能组合成的最大的数字是pq - p - q

任何大于pq - p - q的数字,都能组合得到。

那么,题目中无法组合得到的最大的数字,也就是最后输出的答案,最大也只是256 * 255 - 256 - 255 = 64769

注意到题目还要求,"不存在不能买到块数的上限则输出0",什么意思呢?也就是,只有一个数字3,那么你所有2的倍数都是无法组合成的了,这个时候输出0.

那么我们既然已经知道最后的答案最大也只是64769,所以可以暴力dp,

那么如果最后得到不能组合成的数字大于64769,则说明是:没有上限。也就是只有一个3、或者是两个数字:3、6这样的情况。

要注意数字3和6是不能套用上面的公式的,因为她们不互质。

但是这题最坏的情况,上限也只是64769,也就是说如果出现了255、256这一对数字,64769以上的数字是可以组合成的了。

那么完全背包dp[100000],dp[val] = true表示这个数字能组合成。最后统计下那个最大的数字不能组合成。

如果这个数字 > 64769,则说明不存在上限。

但是会不会是那个数字val = 100001不能组合成,前面的都能组合成呢?我还没得得到证明。

意思就是,会不会最后得到不能组合的数字是100001,这个时候应该是无解的。如果存在这样的情况,那么我的dp数组开得就不够大了。

1、如果存在这样的情况,那么说明那n个数字中,任意两个都不互质。因为如果是互质的,不能表达的最大的数字只是64769,后面的数字肯定能表达。

2、既然她们不互质,设任意一个数是k,(1 <= k <= 256),如果100001不能组合成,那么100001 - k也不能组合成。

100001 - 2k也不能组合成。那么,k最大也就256,最后还是会落在100000之下。所以dp数组是够大的。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <assert.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <bitset>
const int maxn = + ;
int dp[maxn], DFN = ;
int n;
void work() {
DFN++;
dp[] = DFN;
for (int i = ; i <= n; ++i) {
int val;
cin >> val;
for (int j = val; j <= maxn - ; ++j) {
if (dp[j - val] == DFN) dp[j] = DFN;
}
}
int ans = ;
for (int i = maxn - ; i >= ; --i) {
if (dp[i] != DFN) {
ans = i;
break;
}
}
if (ans > ) ans = ;
cout << ans << endl;
}
int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
while (cin >> n) work();
return ;
}

最新文章

  1. Git的用法
  2. 简单学会.net remoting
  3. Java基础,输入输出
  4. Episode 388: Testing vs Monitoring
  5. (原创)android中使用相机的两种方式
  6. 转载: Emmet:HTML/CSS代码快速编写神器
  7. How to upgrade workflow assembly in MOSS 2007
  8. 发发关于JavaScript的感慨,随手记几个js知识碎片
  9. 操作失败,没有该服务权限![ 机构号:99 ,用户ID:50000009 ,服务号:0101030112 ]
  10. java中的异常机制(编译时异常)
  11. hdu 2157 How many ways_ 矩阵快速幂
  12. css 样式重置
  13. 相识mongodb
  14. django中的数据库迁移
  15. ubuntu 用 apt get 安装某个包的某个版本
  16. 【Hadoop UI学习】Hue
  17. 浅析libuv源码-编译启动
  18. Python property() 函数
  19. 远程计算机 进程/服务 启动停止(WMI)
  20. (转)Redis使用详细教程

热门文章

  1. ACM学习历程—Codeforces 446C DZY Loves Fibonacci Numbers(线段树 &amp;&amp; 数论)
  2. AIX 7.1上安装Oracle11g
  3. Oracle分组后取某列最大值的行数据
  4. java.lang.ClassCastException:android.widget.Button cannot be cast to android.widget.ImageView
  5. WebService基础入门(转)
  6. 交互原型设计软件axure rp学习之路(二)
  7. clone分支,修改文件本地commit后, push回原分支失败,处理方法
  8. npm ERR! Cannot read property &#39;match&#39; of undefined 错误处理
  9. pandas基础(3)_数据处理
  10. xrange与range之间的区别