其实就是双重循环在i=1的时候找到解然后记录下来,在后面的时候使用这个解.
比如 1,3,5组成13 最少的方案:
a[3] = {1,3,5}
记录数组:d[i] 表示总数为i的时候最少的组成数量 d[i]
第一个循环 for i=0;i<13;i++
if(i==0) d[i]=1;
第二个循环 for(j=0;j<3;j++)
d[i] = d[i-1]+1;
if( d[i-a[j]] + 1 < d[i]){
d[i] = d[i-a[j]] + 1;
}
完整的:
int lis(int n){
int *d = new int[n + 1];
int a[] = { 1, 3, 5 };
d[0] = 0;
for (int i = 1; i <= n; i++){
d[i] = d[i - 1] + 1;
for (int j = 0; j < 3; j++){
if (a[j] <= i && d[i - a[j]] + 1 < d[i]){
d[i] = d[i - a[j]] + 1;
}
}
}
return d[n];
}