這題目個人感覺有點難,很難抽象出具體的搜尋模型,看了別人的解題報告才有思路。
切割乙個資料即切割紙條,相加的和最接近給出目標的值。
比如,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 那麼 對於這...