1. 问题描述:将n个整数分成k组(k≤n,要求每组不能为空),显然这k个部分均可得到一个各自的和s1,s2,……sk,定义整数P为:
P=(S1-S2)^2+(S1-S3)^2+……+(S1-Sk)^2+(s2-s3)^2+……+(Sk-1-Sk)^2
问题求解:求出一种分法,使P为最小(若有多种方案仅记一种〉
程序说明:
数组:a[1],a[2],...A[N]存放原数
s[1],s[2],...,s[K]存放每个部分的和
b[1],b[2],...,b[N]穷举用临时空间
d[1],d[2],...,d[N]存放最佳方案
程序:
program exp4;
Var i,j,n,k : integer;
a :array [1..100] of integer;
b,d:array [0..100] of integer;
s :array[1..30] of integer;
begin
readln(n,k);
for I:=1 to n do read(a[I]);
for I:=0 to n do b[I]:=1;
cmin:=1000000;
while (b[0]=1) do
begin
for I:=1 to k do s[i]:=0;
for I:=1 to n do
s[b[i]]:=s[b[i]+a[i]];
sum:=0;
for I:=1 to k-1 do
for j:= i+1 to k do
sum:=sum+(s[I]-s[j])*(s[I]-s[j]);
if (cmin>sum) then
begin
cmin:=sum;
for I:=1 to n do d[I]:=b[I];
end;
j:=n;
while (b[j]>k) do j:=j-1;
b[j]:=b[j]+1;
for I:=j+1 to n do b[i]:=1;
end;
writeln(cmin);
for I:=1 to n do write(d[I]:4);
writeln;
end.
2. 问题描述:工厂在每天的生产中,需要一定数量的零件,同时也可以知道每天生产一个零件的生产单价。在N天的生产中,当天生产的零件可以满足当天的需要,若当天用不完,可以放到下一天去使用,但要收取每个零件的保管费,不同的天收取的费用也不相同。
问题求解:求得一个N天的生产计划(即N天中每天应生产零件个数),使总的费用最少。
输入:N(天数N<=29)
每天的需求量(N个整数)
每天生产零件的单价(N个整数)
每天保管零件的单价(N个整数)
输出:每天的生产零件个数(N个整数)
例如:当N=3时,其需要量与费用如下:
程序说明:
b[n]:存放每天的需求量
c[n]:每天生产零件的单价
d[n]:每天保管零件的单价
e[n]:生产计划
程序:
Program exp5;
Var
i,j,n,yu,j0,j1,s:integer;
b,c,d,e: array[0..30]of integer; begin
readln(n);
for i:=1 to n do readln(b[[i],c[I],d[i]];
fori:=1 to n do e[i]:=0;
c[n+1] :=10000;c[n+2]:=0;b[n+1]:=0;jO:=1;
while (jO<=n)do
begin
yu:=c[j0]; j1:=jO; s:=b[j0];
while (yu+d[j1]<c[j1+1]) do
begin
yu:yu+d[j1]; j1:=j1+1;s:=s+b[j1];
end;
e[j0]:=s; jO:=j1+1;
end;
for i:=1 to n do write(e[i]:4);
readln;
end.