解法:转换成01背包问题求解,从正整数中选取若干个数放在容量为M的背包中。
可以用01背包的一维数组进行求解。
程序代码:
#include<stdio.h> const int MAX=100; int f[MAX]; int g[MAX][MAX]; void SumToM(int *value,int N,int M) { int i; int v; for(i=0;i<N;i++) { for(v=M;v>=value[i];v--) { if(f[v]<f[v-value[i]]+value[i]) { f[v]=f[v-value[i]]+value[i]; g[i][v]=1; } else { f[v]=f[v]; g[i][v]=0; } } } printf("最接近%d的和为%d\n",M,f[M]); i = N; //输出解 v = M; while(i-- > 0) { if(g[i][v] == 1) { printf("%d, ",value[i]); v -= value[i]; } } printf("\n"); } int main() { int M; int value[] = {2,9,5,7,4,11,10}; printf("请输入要求的M的值\n"); scanf("%d",&M); int N = sizeof(value)/sizeof(value[0]); SumToM(value,N,M); return 0; }