一条编程题求源代码和思路(pascal语言)

来源:百度知道 编辑:UC知道 时间:2024/05/23 19:34:03
可以上这个网看题目 http://www.vijos.cn/Problem_Show.asp?id=1648
上不了的看题目:
一只孤单的小精灵走在路上,幻想着自己有一天能变成一棵参天大树,忽然,他来到了一个奇怪的地方……
“孩子,我可以赐予你能量。”
“在这个世界里,能量是一个个单位存在的。我会按一定顺序给予你N单位能量,但是每单位的能量由于来源不同,需要消耗你不同的体力。”
小精灵每天只有120的体力,并且体力枯竭(体力<=0)就会死亡。他想获得K单位能量(也就是可以不接受某些能量),他想知道最少需要几天,你就好心帮帮他吧。

输入格式 Input Format
第一行,两个整数,N,K
第二行,N个整数,分别是每单位能量耗费的体力。
对于30%的数据 1<=K<=N<=20
对于100%的数据 1<=K<=N<=3000
输出格式 Output Format
仅一行,一个整数,为最少需要天数。
如果永远不能达到题目要求,输出“You can't do it.”(不包括引号。)

样例输入 Sample Input
3 3
1 1 1
样例输出 Sample Output
1

求大牛们出手帮帮我这菜鸟。给出源代码后最好可以写出关键部分的解释。解释越清楚越好。

不太懂,可能用case of 语句处理

#!/usr/bin/perl
my $total_money=120;
my $need=(split / /,<>)[1];
my @prices=split / /,<>;

sub is_enough{
my @price_sorted=sort {$a<=>$b} @_;
my $mysum=0;
$mysum+=$_ foreach(@price_sorted[0..$need-1]);
return 1 if $mysum<=$total_money;
return 0;
}
for ($need..@prices){
if(&is_enough(@prices[0..($_-1)])){
print $_."\n";
exit(0);
}
}
print "You can't do it.\n";

const
maxn=3000;
maxm=120;

var
a:array[0..maxn] of longint;
dp:array[0..maxn,1..2] of longint;
i,j,m,n,k,p,q:longint;

begin
readln(n,k);
for i:=1 to n do read(a[i]);

fillchar(dp,sizeof(dp),10);

dp[0,1]:=1;
dp[0,2]:=0;
for i:=1 to n do
if a[i]<120 then
for j:=k downto 1 do
if