蓝桥杯 ALGO-108 最大体积 (动态规划)

问题描述
  每个物品有一定的体积(废话),不同的物品组 合,装入背包会战用一定的总体积。假如每个物品有无限件可用,那么有些体积是永远也装不出来的。为了尽量装满背包,附中的OIER想要研究一下物品不能装 出的最大体积。题目保证有解,如果是有限解,保证不超过2,000,000,000
  如果是无限解,则输出0
输入格式
  第一行一个整数n(n<=10),表示物品的件数
  第2行到N+1行: 每件物品的体积(1<= <=500)
输出格式
  一个整数ans,表示不能用这些物品得到的最大体积。
样例输入
3
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 最大体积 (动态规划))