【NOIP2012模拟11.6】背包问题
来源:互联网 发布:淘宝永久封店重新开通 编辑:程序博客网 时间:2024/04/28 05:33
Description
背包问题,是一个流传千古的经典,问题中每个物品有一定的体积,还有一个一定容量的背包。假如每个物品有无限件可用,那么还是有些体积是永远也装不出来的。为了尽量装满背包,小Z要研究一下物品不能装出的最大体积。题目保证有解,如果是是有限解,保证不超过2,000,000,000
如果是无限解或者无解(所有体积都能装出来),则输出0
Input
第一行一个整数n,表示物品的件数
第2行到N+1行: 每件物品的体积v[i]
Output
一个整数ans,表示不能用这些物品得到的最大体积。
Sample Input
3
3
6
10
Sample Output
17
Data Constraint
Hint
n<=10,v[i]<=500
The Solution
这道题应该可以说是一眼题了吧。。。
首先得先判断: 如果输入的那些数的公因数为1,则说明有解,否则无解。证明很显然,就不证了。
然后就可以做个01背包就搞定了
设一个F数组Dp。
预处理F[0]=1,
如果是原来的数字或上0就是它自己即数字本身能达到
CODE
#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>#define fo(i,a,b) for (int i=a;i<=b;i++)#define fd(i,a,b) for (int i=a;i>=b;i--)#define N 50#define Maxn 100005using namespace std;int a[N],F[Maxn];int Gcd(int x,int y){ if (!y) return x; else return Gcd(y,x%y);}int main(){ int n; scanf("%d",&n); fo(i,1,n) scanf("%d",&a[i]); int g=a[1]; fo(i,2,n) g=Gcd(g,a[i]); if (g==1) { F[0]=1; fo(i,1,n) fo(j,a[i],65536) F[j]|=F[j-a[i]]; fd(i,65536,0) { if (!F[i]) { printf("%d",i); return 0; } } } printf("0"); return 0; }
1 0
- 【NOIP2012模拟11.6】背包问题
- noip2012 寻宝 (模拟)
- 【NOIP2012模拟8.20】Memory
- 【NOIP2012模拟8.20】Memory
- 【NOIP2012模拟11.8】刪數
- 【NOIP2012模拟10.27】比赛
- 【NOIP2012模拟10.25】单元格
- 【NOIP2012模拟10.25】剪草
- 【NOIP2012模拟10.25】单元格
- 【NOIP2012模拟10.25】旅行
- 【NOIP2012模拟10.25】剪草
- 【NOIP2012模拟10.25】旅行
- 【NOIP2012模拟10.26】雕塑
- 【NOIP2012模拟10.26】电影票
- 【NOIP2012模拟10.6】购买
- 【NOIP2012】寻宝 模拟
- 模拟退火背包问题求解
- 【模拟】【noip2012普及组】寻宝
- Matrix Code
- php实现栈操作
- 【63】数据流中的中位数
- [CentOS]安装软件:/lib/ld-linux.so.2: bad ELF interpreter解决
- 跟我学Redis(15)—Redis主从复制
- 【NOIP2012模拟11.6】背包问题
- DEV 的使用技巧(开学季)
- scala基础----->拆分List操作
- xilian5 ohih
- Sizeof与Strlen的区别与联系
- 六大经典排序算法(Java版):冒泡、选择、插入、希尔、快速、归并
- HADOOP自带测试类介绍及使用
- 宏与预处理&函数与函数库
- sqlite3小型数据库移植到arm,让arm跑起聊天室的服务器