题目链接: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;
}