金明的预算方案 NDK1503 解题报告

本文深入探讨了NDK1503问题中使用动态规划解决复杂多重选择问题的策略。通过引入初始化、动态规划函数和主要处理逻辑,文章详细解释了如何高效地计算最优解,同时利用附件的选择增强主件价值。重点在于展示通过精心设计的算法步骤,解决实际问题中常见的时间和空间复杂度挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
program NDK1503;

type atp=record
		v,p,num:longint;
	end;

var
	n,m:longint;
	a:array [1..60] of atp;
	f:array [0..32000] of longint;
	t1,t2:array [1..60] of atp;
	
procedure init;
var
	i,tex:longint;
begin
	readln(n,m);
	for i:=1 to m do
		begin
			readln(a[i].v,a[i].p,tex);
			a[i].num:=tex;
			if tex<>0 then 
				begin
					if t1[tex].v=0 then 
						begin
							t1[tex].v:=a[i].v;
							t1[tex].p:=a[i].p;
						end
					else 
						begin
							t2[tex].v:=a[i].v;
							t2[tex].p:=a[i].p;
						end;
				end;
		end;
end;

function max(x,y:longint):longint;
begin
	if x>y then exit(x) else exit(y);
end;

procedure main;
var
	i,j,maxx:longint;
begin
	for i:=1 to m do
		begin
			if a[i].num=0 then
				begin
					for j:=n downto 0 do 
						begin
							if j-a[i].v>=0 then f[j]:=max(f[j],f[j-a[i].v]+a[i].v*a[i].p);//只选主件
							if (t1[i].v<>0) and (j-a[i].v-t1[i].v>=0) then f[j]:=max(f[j],f[j-a[i].v-t1[i].v]+a[i].v*a[i].p+t1[i].v*t1[i].p);//选主件+附件1
							if (t2[i].v<>0) then
								begin
									if j-a[i].v-t2[i].v>=0 then f[j]:=max(f[j],f[j-a[i].v-t2[i].v]+a[i].v*a[i].p+t2[i].v*t2[i].p);//选主件+附件2
									if j-a[i].v-t1[i].v-t2[i].v>=0 then f[j]:=max(f[j],f[j-a[i].v-t1[i].v-t2[i].v]+a[i].v*a[i].p+t1[i].v*t1[i].p+t2[i].v*t2[i].p);//选主件+附件1+附件2
								end;
						end;
				end;
		end;
end;

begin
	assign(input,'NDK1503.in'); reset(input);
	assign(output,'NDK1503.out'); rewrite(output);

	init;
	main;
	writeln(f[n]);

	close(input); close(output);
end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值