剪枝的條件很明確,如果現在的 前面已經斷開的紙帶的和與當前紙帶的和大於目標值,就不用向下搜尋了。
注意乙個細節是,第乙個只能加到當前紙帶上
其實這種題還是乙個表示狀態的問題
dfs(sum,cur,p)
表示前面的和 當前紙帶的和 當前走到了第幾個
這樣足夠清晰的描述問題了
#include #include #include #include #include #include #include #include using namespace std;
#define read freopen("acm.in","r",stdin)
#define ll long long
#define pii pair#define pdi pair#define mpi map::iterator
#define fst first
#define sec second
#define ms(x,d) memset(x,d,sizeof(x))
#define inf 0x3f3f3f3f
#define all(x) x.begin(),x.end()
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define max 5500
#define root 0,n-1,1
#define pb push_back
#define for(a,b,c) for(int a=b;atar)
return ;
if(p==n)
else if(sum>tmp&&sum<=tar)
int main()
{ while(scanf("%d%s",&tar,num))
{if(tar==0&&num[0]=='0')
return 0;
tmp=0,cnt=0;
top=0;
n=strlen(num);
if(!check())
{cout<<"error"<1)
{cout<<"rejected"<
POJ1416 切割紙條 DFS 剪枝
這題目個人感覺有點難,很難抽象出具體的搜尋模型,看了別人的解題報告才有思路。切割乙個資料即切割紙條,相加的和最接近給出目標的值。比如,12346是資料,target的值是50,應該把數字切成四部分,分別是1 2 34 6。因為這樣所得到的和43 1 2 34 6 是所有可能中最接近而不超過50的。碎...
poj1416 簡單dfs列舉題
這題沒啥好說的,就是將字串num分割成好幾個整數,並相加起來,看看哪種分割情況的和是最接近 t 的 因為每個num最多只有6位,所以總共的分割情況也就32種,非常簡單,只要能寫出dfs函式就可以了 include includeusing namespace std int t,flag,k,ans...
POJ 生日蛋糕 DFS 剪枝
題目鏈結 題目大意 乙個多層生日蛋糕。要求下面一層一定要比上面的一層大而且高,求符合該條件的蛋糕,其中最小的表面積 解題思路 要求出最小表面積且下面的要比上面的大,所以每一層的半徑和高度最小值為該層的層數 從上到下數的層數 這樣一一枚舉每層的半徑和高度。但是由於情況太多,所以需要剪枝來降低搜尋的次數...