POJ1416 切割紙條 DFS 剪枝

2021-06-19 13:37:10 字數 1569 閱讀 7425

這題目個人感覺有點難,很難抽象出具體的搜尋模型,看了別人的解題報告才有思路。

切割乙個資料即切割紙條,相加的和最接近給出目標的值。

比如,12346是資料,target的值是50,應該把數字切成四部分,分別是1、2、34、6。因為這樣所得到的和43 (= 1 + 2 + 34 + 6) 

是所有可能中最接近而不超過50的。碎紙還有以下三個要求:

1、如果target的值等於紙條上的值,則不能切。

2、如果沒有辦法把紙條上的數字切成小於target,則輸出error。如target是1而紙條上的數字是123,則無論你如何切得到的和都比1大。

3、如果有超過一種以上的切法得到最佳值,則輸出rejected。如target為15,紙條上的數字是111,則有以下兩種切法11、1或者1、

2140k 32ms c++ 2636b 2013-12-05 18:14:25

下面是**:

#include#include#include#include #include #include #include #include using namespace std;

#include #include #include #define n 12

char g_page[n] = {};

int g_target = 0;

int g_min = int_max;

int g_mway = 0;

short g_flag[1000000] = {};

int getnum(int ist, int ilen, const char *insz)

return atoi(szint);

}int getsub(int ist, const char *insz, char *outsz)

return atoi(outsz);

}void dfs(const char *szint, int isum, int icen)

char sztmep[n];

memset(sztmep, 0, sizeof(sztmep));

getsub(i, szint, sztmep);

if(i == ilen)

continue;

} dfs(sztmep, isum + itemp, icen*10+i); }

return ;

}void printway()

printf(" ");

} while(g_page[ipos])

printf("\n");

}int getmin()

return isum;

}int main()

memset(g_flag, 0, sizeof(g_flag));

g_min = int_max;

g_mway = 0;

if(getmin() > g_target)

else

else

}//printf("g_min=%d g_mway=%d\n", g_target-g_min, g_mway);

} //cout<<::gettickcount() - take<

poj1416數字切割解題報告

題意 有一段紙片,就是乙個不超過7位數的整數,現在給定你乙個目標值 aim 讓你去選擇把紙片切成幾段,然後這個幾段的和值 最接近 aim 且不超過 aim,分析 對於這個紙段,比如乙個 四位數的 1234,那麼第一你就有以下幾種切法 1 234 1 2 34 1 2 3 4 12 34 那麼 對於這...

poj1416 簡單dfs列舉題

這題沒啥好說的,就是將字串num分割成好幾個整數,並相加起來,看看哪種分割情況的和是最接近 t 的 因為每個num最多只有6位,所以總共的分割情況也就32種,非常簡單,只要能寫出dfs函式就可以了 include includeusing namespace std int t,flag,k,ans...

置頂 poj1416數字切割解題報告

題意 有一段紙片,就是乙個不超過7位數的整數,現在給定你乙個目標值 aim 讓你去選擇把紙片切成幾段,然後這個幾段的和值 最接近 aim 且不超過 aim,分析 對於這個紙段,比如乙個 四位數的 1234,那麼第一你就有以下幾種切法 1 234 1 2 34 1 2 3 4 12 34 那麼 對於這...