題目鏈接:http://acm.nyist.net/JudgeOnline/problem.php?pid=708
大意是,給一個數n,然後讓你使用1,+,*,(,);組成表達式,使其值爲n,問最少需要多少個1;
////////////////////////////
簡單的DP
設f[i]爲表達式值爲i的時候最少要用的1的數目
則f[i]可以有 f[i-j]和 f[j]推出 此時i爲j+(i-j) 也可以由f[j]和f[i/j]推出 此時i須爲j的倍數 此時i爲j*(i/j);
所以要分情況 取兩者最小,但是如果爲j*(i-j)的時候j不能爲1,因爲此時i/j爲i f[i]的結果還未得出;
具體代碼如下:
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
int f[10005];
void init()
{
f[1]=1;
f[2]=2;
for(int i=3;i<=10000;++i)
{
for(int j=1;j<i;++j)
{
int t=f[j]+f[i-j];
if(j!=1&&i%j==0&&(f[j]+f[i/j])<t)
t=f[j]+f[i/j];
if(f[i]>t||!f[i])
f[i]=t;
}
}
}
int main()
{
int n;
init();
while(cin>>n)
cout<<f[n]<<endl;
return 0;
}