解法:转换成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;
}