從給定的N個正數中選取若干個數之和最接近M
阿新 • • 發佈:2019-02-11
解法:轉換成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; }