从给定的N个正数中选取若干个数之和最接近M

来源:互联网 发布:认证发票用什么软件 编辑:程序博客网 时间:2024/04/29 18:59

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


1 0
原创粉丝点击