vijosP1159 岳麓山上打水

来源:互联网 发布:淘宝购物车东西没了 编辑:程序博客网 时间:2024/06/11 09:40
vijosP1159 岳麓山上打水

 

链接:https://vijos.org/p/1159

 

【思路】

   迭代加深搜索+完全背包判断。

   自己没有思路,看的别人代码。

   总体上讲就是不断增大桶的数目并以之为上界搜索,用DP判断搜索是否可行。貌似数据很水所以可以较快通过。

   其中DFSID(cur+1,dep)很奇妙,如果改成取i从0到n的搜索的话会TLE。

 

【代码】

 

 

 1 #include<iostream> 2 #include<cstring> 3 #include<cstdlib> 4 #include<algorithm> 5 using namespace std; 6  7 const int maxn = 100+10; 8  9 int dp[20010];10 int ans[maxn],a[maxn];11 int n,q,max_d;12 13 int check(int sum)14 {15     int &cur=dp[sum];16     if(cur != -1) return cur;17     if(sum==0) return cur=1;18     else 19     {20         for(int i=0;i<max_d;i++)21           if(sum>=ans[i] && check(sum-ans[i]))22              return cur=1;23     }24     return cur=0;25 }26 27 void DFSID(int cur,int dep) {28     if(dep==max_d)                   //到达深度限制判断是否能够组成q 29     {30         memset(dp,-1,sizeof(dp));31         if(check(q))32         {33             cout<<max_d<<" ";34             for(int i=0;i<dep;i++) cout<<ans[i]<<" ";35             exit(0);36         }37         return ;  //return 38     }39     40     if(cur>=n) return ;41     42     ans[dep]=a[cur];43     DFSID(cur+1,dep+1);44     DFSID(cur+1,dep);   //一个不错的写法 45 }46 47 int main() {48     ios::sync_with_stdio(false);49     50     cin>>q>>n;51     for(int i=0;i<n;i++) cin>>a[i];52     53     sort(a,a+n);         //字典序要求最小 54     55     for(max_d=1;max_d<=n;max_d++)56        DFSID(0,0);57     58     return 0;59 }

 

0 0
原创粉丝点击