p1120洛谷
来源:互联网 发布:java cs架构开发书本 编辑:程序博客网 时间:2024/06/08 19:45
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=70;
int n,a[N],cnt,maxn,goal;
bool cmp(int x,int y){return x>y;}
bool use[N];
inline void dfs(int ans,int num,int pre){//当前拼成的长度,目标大木棍的数目,当前搜索小木棍的位置
if(num==0){printf("%d\n",goal); exit(0);}
if(maxn-ans<a[cnt])return; //"2"如果剩余长度小于最小长度return
if(ans==goal)
{
dfs(0,num-1,1); //如果失败return
return;
}
for(register int i=pre;i<=cnt;i++)//"1"
if(!use[i] && ans+a[i]<=goal){
use[i]=1;
dfs(ans+a[i],num,i+1);
use[i]=0;
while(a[i]==a[i+1])i++;//"3"17,9,9,9,9,8,5,2……如果当前最长小棒为17,它与第一个9组合之后dfs发现不能拼成len
if(ans==0 || ans+a[i]==goal) return; //"4".8 7 5 3 3 2 2->15
}//如果8+7成功,但后面的失败了,就不用再搜索8+5+2等等了。
// 1. 我们搜索的木棍长度假设是合法的,那么每一组达到了当前长度的木棍组合,一定是存在的。
//例如样例:5 2 1 5 2 1 5 2 1 比如说我搜索木棍总长的因数6,我们目前搜的木棍组是(5,1),如果这个6的木棍长度是合法的话,那么必有一组木棍组合是(5,1).
//所以当我们搜索的木棍组是(5,1)但在之后的搜索中搜不出长度为6的木棍组,那么这个木棍长度就是非法的。
//推广到所有长度,即只要如果当前木棍组达到了木棍长度,却在之后的搜索中的木棍组并不能达到这个木棍长度,那么这个木棍长度就是不合法的。
}
int main(){
scanf("%d",&n);
for(register int i=1;i<=n;i++){
int x;
scanf("%d",&x);
if(x<=50){a[++cnt]=x; maxn+=a[cnt];}
}
sort(a+1,a+cnt+1,cmp);
goal=a[1];
while(goal<=maxn/2)//"0"
{
if(maxn%goal==0)
dfs(0,maxn/goal,1);//当前拼成的长度,目标大木棍数目,上一个数的位置
goal++;
}
printf("%d\n",maxn);
return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
const int N=70;
int n,a[N],cnt,maxn,goal;
bool cmp(int x,int y){return x>y;}
bool use[N];
inline void dfs(int ans,int num,int pre){//当前拼成的长度,目标大木棍的数目,当前搜索小木棍的位置
if(num==0){printf("%d\n",goal); exit(0);}
if(maxn-ans<a[cnt])return; //"2"如果剩余长度小于最小长度return
if(ans==goal)
{
dfs(0,num-1,1); //如果失败return
return;
}
for(register int i=pre;i<=cnt;i++)//"1"
if(!use[i] && ans+a[i]<=goal){
use[i]=1;
dfs(ans+a[i],num,i+1);
use[i]=0;
while(a[i]==a[i+1])i++;//"3"17,9,9,9,9,8,5,2……如果当前最长小棒为17,它与第一个9组合之后dfs发现不能拼成len
if(ans==0 || ans+a[i]==goal) return; //"4".8 7 5 3 3 2 2->15
}//如果8+7成功,但后面的失败了,就不用再搜索8+5+2等等了。
// 1. 我们搜索的木棍长度假设是合法的,那么每一组达到了当前长度的木棍组合,一定是存在的。
//例如样例:5 2 1 5 2 1 5 2 1 比如说我搜索木棍总长的因数6,我们目前搜的木棍组是(5,1),如果这个6的木棍长度是合法的话,那么必有一组木棍组合是(5,1).
//所以当我们搜索的木棍组是(5,1)但在之后的搜索中搜不出长度为6的木棍组,那么这个木棍长度就是非法的。
//推广到所有长度,即只要如果当前木棍组达到了木棍长度,却在之后的搜索中的木棍组并不能达到这个木棍长度,那么这个木棍长度就是不合法的。
}
int main(){
scanf("%d",&n);
for(register int i=1;i<=n;i++){
int x;
scanf("%d",&x);
if(x<=50){a[++cnt]=x; maxn+=a[cnt];}
}
sort(a+1,a+cnt+1,cmp);
goal=a[1];
while(goal<=maxn/2)//"0"
{
if(maxn%goal==0)
dfs(0,maxn/goal,1);//当前拼成的长度,目标大木棍数目,上一个数的位置
goal++;
}
printf("%d\n",maxn);
return 0;
}
阅读全文
0 0
- p1120洛谷
- 洛谷P1120 小木棍
- 洛谷 【P1120】 小木棍
- 【洛谷】P1120 小木棍[数据加强版]
- 洛谷 P1120 小木棍 [数据加强版 ]
- 洛谷 P1120 小木棍 [数据加强版]
- 【搜索】洛谷 P1120 小木棍 [数据加强版]
- 洛谷p1120小木棍【数据加强版】c++
- 洛谷P1120 小木棍[数据加强版](回溯法)
- [P1120]小木棍
- P1120 小木棍 数据加强版
- P1120 小木棍(数据加强版)
- P1120 小木棍 [数据加强版]
- P1120 小木棍 [数据加强版]
- P1120 小木棍 [数据加强版]
- luogu P1120 小木棍 [数据加强版]
- 洛谷
- 洛谷
- bzoj3155: Preprefix sum 树状数组
- 【Python】ItemBasedCF的游戏推荐系统
- Spring整合JMS(二)——三种消息监听器
- GoldenGate从oracle迁移数据到mysql
- 二叉树之插入查找
- p1120洛谷
- Oracle VM VirtualBox 导入vdi
- mysql技巧
- 取span的文本和value值
- HTML的<table>标签基础
- Spring整合JMS(三)——MessageConverter介绍
- DrawerLayout的简单使用
- 获取远程图片保存到本地
- Java GUI