PASCAL高手进,简单的一个问题,小弟不会

来源:百度知道 编辑:UC知道 时间:2024/05/25 01:35:27
设有一个背包,可以放入重量为S。现有N件物品,重量分别是W1.W2.W3。。。均为整数,从这N件物品中挑出若干件。,使得放入背包里的重量之和正好等于S。
找出并输出所有的解;
小弟在这候着,谢谢了;

这个不是简单的动态规划!
注意一下,它要求是和正好等于s,而不是尽可能的大!
所以不是最优子问题。不可以用动态规划做。
这种题目只能用搜索。你的数据范围没有给,不好判断用什么搜索。
如果N小的话,纯搜索就过得了。如果N大的话,搜索就要优化。
你把N的范围给一下,我试试写个程序给你。

背包问题.
貌似不难.

如果数据范围小就搜索吧,简单
以下是动规代码(这个是输出总方案数的,你要具体解再想办法记录一下就好了)
var i,j,n,s:integer;
w:array[0..100] of integer;
f:array[0..100,0..20000] of integer;
begin
readln(s,n);
for i:=1 to n do read(w[i]);
fillchar(f,sizeof(f),0);
f[0,0]:=1;
for i:=1 to n do
for j:=0 to s do
if j=0 then f[i,j]:=1
else if j>=w[i] then f[i,j]:=f[i-1,j-w[i]]+f[i-1,j]
else f[i,j]:=f[i-1,j];
writeln(f[n,s]);
end.

用了滚动数组和数组的简化(w数组取消),简化程序
var
i,j,n,s,w:integer;
f:array[0..1,0..20000] of integer;
begin
readln(s,n);
f[0,0]:=1;
for i:=1 to n do
begin
read(w);
f[0]:=f[1];
for j:=0 to s do
if (j>=w) and (f[i-1,j-w]+w>f[i-1,j]) then