HDU-1171 Big Event in HDU(01背包)

本文介绍了一个关于 HDU 计算机学院历史变迁的问题,涉及如何公平地分配设施资源,通过背包算法模拟决策过程。核心在于理解01背包问题的应用,目标是使两所学院得到尽可能接近的价值分配。

Big Event in HDU

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 64528    Accepted Submission(s): 21654


 
Problem Description
Nowadays, we all know that Computer College is the biggest department in HDU. But, maybe you don't know that Computer College had ever been split into Computer College and Software College in 2002.
The splitting is absolutely a big event in HDU! At the same time, it is a trouble thing too. All facilities must go halves. First, all facilities are assessed, and two facilities are thought to be same if they have the same value. It is assumed that there is N (0<N<1000) kinds of facilities (different value, different kinds).
 
 
Input
Input contains multiple test cases. Each test case starts with a number N (0 < N <= 50 -- the total number of different facilities). The next N lines contain an integer V (0<V<=50 --value of facility) and an integer M (0<M<=100 --corresponding number of the facilities) each. You can assume that all V are different.
A test case starting with a negative integer terminates input and this test case is not to be processed.
 
 
Output
For each case, print one line containing two integers A and B which denote the value of Computer College and Software College will get respectively. A and B should be as equal as possible. At the same time, you should guarantee that A is not less than B.
 
 
Sample Input

2

10 1

20 1

3

10 1 

20 2

30 1

-1

 
 
Sample Output

20 10

40 40

 
 
Author
lcy
 
 
Recommend

这个题的思考点主要还是在能想到,背包的容量是(总的钱 / 2 ) 

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
const int N=5000010;
int f[N];
int a,b,m;
int sum,ans,cou;
int v[5010];

int main()
{
	int n;
	while(cin>>n,n>=0)
	{
		memset(f,0,sizeof(f));
		sum=0;//需要的分的钱的总数 
		cou=0;
		for(int i=1;i<=n;i++)
		{
			cin>>a>>b;
			while(b--)
			{
				v[++cou]=a;
				sum+=a;
			}
		}
		
		for(int i=1;i<=cou;i++)//钱的总数目
		{
			for(int j=sum/2;j>=v[i];j--)//01背包 
			{
				f[j]=max(f[j],f[j-v[i]]+v[i]);
			}
		}
		int res1=f[sum/2];
		int res2=sum-res1;
		if(res1>res2)
		cout<<res1<<" "<<res2<<endl;
		else cout<<res2<<" "<<res1<<endl;
	}
	return 0;
}

### 在 Vivado 中配置和使用 HDU-XL-01 开发板的方法 #### 1. 确定开发环境与硬件支持 HDU-XL-01 是一款基于 Xilinx FPGA 的开发板。在 Vivado 中使用该开发板时,首先需要确保所使用的 FPGA 器件型号被 Vivado 支持[^1]。例如,如果开发板采用的是 Spartan 或 Artix 系列器件,则需要选择对应的器件型号。 #### 2. 创建 Vivado 工程 在 Vivado 中创建一个新的工程,并指定目标 FPGA 器件型号为 HDU-XL-01 所使用的具体型号。通过“Create Project”向导完成工程设置,并确保选择了正确的 FPGA 器件[^1]。 #### 3. 引入开发板约束文件 为了正确映射开发板上的资源(如 LED、按键、UART 等),需要引入开发板的约束文件(XDC 文件)。如果没有现成的 XDC 文件,可以根据开发板手册手动编写约束文件。以下是一个简单的 XDC 文件示例: ```xdc # LED 约束 set_property PACKAGE_PIN L15 [get_ports {LED[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[0]}] set_property PACKAGE_PIN M14 [get_ports {LED[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[1]}] # 按键约束 set_property PACKAGE_PIN J15 [get_ports BTN] set_property IOSTANDARD LVCMOS33 [get_ports BTN] ``` 将此文件添加到 Vivado 工程中,并确保其正确应用到设计中[^1]。 #### 4. 设计实现 根据具体功能需求,设计相应的 Verilog 或 VHDL 模块。例如,若需要实现一个简单的 LED 闪烁功能,可以参考以下代码: ```verilog module blinky ( input wire clk, // 时钟信号 input wire reset, // 复位信号 output reg [1:0] LED // LED 输出 ); reg [24:0] counter; always @(posedge clk or posedge reset) begin if (reset) begin counter <= 25'd0; LED <= 2'b00; end else begin counter <= counter + 1'b1; if (counter == 25'd50000000) begin // 约 1 秒 counter <= 25'd0; LED <= LED + 1'b1; end end end endmodule ``` 将上述模块添加到工程中,并确保其输入输出端口与开发板约束文件中的定义一致[^1]。 #### 5. 综合、实现与生成比特流 完成设计后,在 Vivado 中依次执行综合、实现和生成比特流的操作。确保所有步骤均无错误或警告信息。完成后,生成的比特流文件将用于编程 FPGA[^1]。 #### 6. 编程 FPGA 使用 Vivado 的“Open Hardware Manager”功能连接到实际硬件设备,并将生成的比特流文件下载到 HDU-XL-01 开发板中。确保开发板已正确连接至计算机,并安装了相应的驱动程序。 #### 7. 测试功能 下载比特流后,测试开发板上实现的功能是否符合预期。例如,观察 LED 是否按照设计要求闪烁。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值