jingju11 发表于 2012-11-20 07:12
Do you have any fast algorithm to find the solution? I amnot sure why this was called mathematical m ...
这里提供一种不一样的思路:
首先,找出各变量的所有不重复的组合;
然后,对每种组合进行求和;
最后,对于任意给定的值,找出与此值距离最小的组合,并且输出。
plus,佩服京剧大人的output功力,我是做不到你的程度啦。
程序如下:
- data test1;
- input v1-v16;
- cards;
- 1 4 7 13 20 29 52 81 205 338 504 543 2488 3300 5360 5922
- ;run;
- %macro test(n);
- data _null_;
- set test1;
- %do ii = 1 %to &n.;
- call symputx("v_&ii.", v&ii.);
- %end;
- run;
- data test2;
- %do ii = 1 %to &n.;
- do x&ii. = 0 to 1;
- %end;
- output;
- %do ii = 1 %to &n.;
- end;
- %end;
- run;
- data test3;
- format total 20.;
- set test2;
- total = 0;
- %do ii = 1 %to &n.;
- total = total + x&ii. *&&v_&ii..;
- %end;
- row_id + 1;
- run;
- %mend;
- %test(n=16);
- %macro ans_output(n, input_n);
- data test4;
- format dis 20.;
- set test3;
- dis = abs(total - &input_n.);
- run;
- proc sql;
- create table test5 as
- select *
- from test4
- where dis = (select min(dis) from test4);
- quit;
- proc print data = test5;
- var dis total x1-x&n.;
- run;
- %mend;
- %ans_output(n=16, input_n = 91);
复制代码