动态规划-由数字a1,a2,a3组成数字n(通用代码) //数字组合通用程序 #include <stdio.h> int resolve(int arr[100][6], int list[], int n) { int i, j; for (i = 1; i <= n; i++)//i的初值可以直接为第一个元素 { for (j = 1; j < 4; j++)//跳过第一个元素 { //第一个条件判断:数字n与组成元素比较 if (i == list[j]) { //list中元素存在倍数关系,或者和的关系时。否则可以直接写成arr[i][list[j]]=1 arr[i][list[j]] = arr[i][list[j - 1]] + 1; } else if (i - list[j] > 0 )// { //第一个条件判断:数字n包含组成元素 if (i - list[j] < list[j]) { arr[i][list[j]] = arr[i - list[j]][list[j - 1]] + arr[i][list[j - 1]]; } else { arr[i][list[j]] = arr[i - list[j]][list[j]] + arr[i][list[j - 1]]; } } else { arr[i][list[j]] = arr[i][list[j - 1]]; } } } return arr[n][list[3]]; } int main(void) { int n; int list[4] = { 0, 1, 2, 3 };//组成元素列表,0是补位,让list[0]能取到值。 int arr[100][6] = { 0 };//此处列数由list元素中最大值+1确定。 while (scanf("%d", &n) != EOF) { printf("%d", resolve(arr, list, n)); } return 0; }