C++ 高手!!! 解答此题者,再加50分!!

来源:百度知道 编辑:UC知道 时间:2024/06/02 22:17:25
//原题地址http://acm.pku.edu.cn/JudgeOnline/problem?id=1011&lang=zh-CN&change=true

#include <iostream>
using namespace std;
int b[52]={0},c[52]={0},he=0,su=0;//b[i]记录长为i的棍子的根数
//c[]来帮助b[]还原
//he记录每次累计的棍子长度
//su循环可能的棍子原长度
int tryb(int i)//找出长度不超过i的棍子中最长的棍子,返回此长度
{
for(int j=i;j>=1;--j)
if(b[j]>0)return j;
return 0;
}
int trya(int i)//判断在当前组合的he下 能否利用所有长度不超过i的棍子
//组合成为su(返回1,若失败返回0),这是关键。
{
int j=tryb(i);//不超过i的最长的棍子
if(j==0)return 0;//没有棍子了,此时的he必然失败
if(he+j==su){--b[j];return 1;}//成功,扣除b[j],返回1
if(he+j<su)//若加上j后长度适合
{
he+=j;--b[j];//首先加上j
if(trya(j))return 1;//看看此时的he能否利用现在剩

给你一个别人的代码参考下吧

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <functional>
using namespace std;

int stick[100], n;
bool used[100];

//unused:没有使用的棍子的数目
//left:剩下的长度
//len:当前认为的计算的长度
bool dfs(int unused, int left, int len)
{
// 所有的棍子已经用了,且没有剩余的长度,符合搜索条件
if (unused == 0 && left == 0)
return true;
int i;
//没有剩下的.则新开一条棍子
if (left == 0)
left = len;
//寻找没有使用过的棍子
for (i=0; i<n; ++i)
{
//找到没有用过的,而且长度比left值要小(能够填进去)
if (!used[i] && stick[i]<=left)
{
//使用当前棍子
used[i] = true;
//若在当前情况下能够扩展出正确答案,则返回
if (dfs(unused-1, left-stick[i], len))
//成功搜索,返回
return true;
//否则不使用当前的棍子
used[i] = false;
//若使用stick[i]不能扩展出正确结果,那么如果stick[i]与left等长,则证明len不可能是正确答案
//若left与len等长,就是没有办法