蓝桥杯 ALGO-108最大体积 (动态规划)
Posted yifan2016
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯 ALGO-108最大体积 (动态规划)相关的知识,希望对你有一定的参考价值。
问题描述
每个物品有一定的体积(废话),不同的物品组 合,装入背包会战用一定的总体积。假如每个物品有无限件可用,那么有些体积是永远也装不出来的。为了尽量装满背包,附中的OIER想要研究一下物品不能装 出的最大体积。题目保证有解,如果是有限解,保证不超过2,000,000,000
如果是无限解,则输出0
如果是无限解,则输出0
输入格式
第一行一个整数n(n<=10),表示物品的件数
第2行到N+1行: 每件物品的体积(1<= <=500)
第2行到N+1行: 每件物品的体积(1<= <=500)
输出格式
一个整数ans,表示不能用这些物品得到的最大体积。
样例输入
3
3
6
10
3
6
10
样例输出
17
个人觉得这道题的测评似乎有一点问题,我的测试只通过了90%,只有输入1 1的时候,我的程序自己调试时输出0没问题,但在他那里却报运行错误
1 #include<iostream> 2 #include<queue> 3 #include<set> 4 #include<algorithm> 5 using namespace std; 6 int gcd(int a,int b){ 7 if(b==0)return a; 8 return gcd(b,a%b); 9 } 10 int N,a[20]; 11 bool isRight(){ 12 for(int i=1;i<N;i++){ 13 for(int j=i+1;j<=N;j++){ 14 int s=gcd(a[i],a[j]); 15 if(s!=a[i]&&s!=a[j]) return 1; 16 } 17 } 18 return 0; 19 } 20 set<long> dp; 21 bool canFind(long n){ 22 for(int i=1;i<=N;i++){ 23 if(n>=a[i]&&!dp.count(n-a[i])) { 24 return 0; 25 } 26 } 27 return 1; 28 } 29 int main(){ 30 cin>>N; 31 for(int i=1;i<=N;i++){ 32 cin>>a[i]; 33 } 34 if(!isRight()){ 35 cout<<"0"<<endl; 36 return 1; 37 } 38 sort(a+1,a+N+1); 39 queue<long> q; 40 41 for(int i=1;i<a[1];i++){ 42 dp.insert(i);q.push(i); 43 } 44 45 long ans=0; 46 while(!q.empty()){ 47 long top=q.front();q.pop(); 48 ans=max(top,ans); 49 for(int i=1;i<=N;i++){ 50 if(!dp.count(top+a[i])&&canFind(top+a[i])){ 51 dp.insert(top+a[i]); 52 q.push(top+a[i]); 53 } 54 } 55 } 56 cout<<ans<<endl; 57 return 0; 58 }
以上是关于蓝桥杯 ALGO-108最大体积 (动态规划)的主要内容,如果未能解决你的问题,请参考以下文章