没有合适的资源?快使用搜索试试~ 我知道了~
ACM程序设计竞赛例题.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 102 浏览量
2022-06-11
08:24:39
上传
评论 1
收藏 1.41MB DOCX 举报
温馨提示
试读
64页
ACM程序设计竞赛例题.docxACM程序设计竞赛例题.docxACM程序设计竞赛例题.docxACM程序设计竞赛例题.docxACM程序设计竞赛例题.docxACM程序设计竞赛例题.docxACM程序设计竞赛例题.docxACM程序设计竞赛例题.docxACM程序设计竞赛例题.docx
资源推荐
资源详情
资源评论
备战 ACM 资料
习题
1. 0-1 背包问题
在 0 / 1 背包问题中,需对容量为 c 的背包进行装载。从 n 个物品中选取装入背
包的物品,每件物品 i 的重量为 wi ,价值为 pi 。对于可行的背包装载,背包
中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高。
程序如下:
#include <stdio.h>
void readdata();
void search(int);
void checkmax();
void printresult();
int c=35, n=10;
int w[10], v[10];
int a[10], max;
值
//c: 背包容量;n:物品数
//w[i]、v[i]:第 i 件物品的重量和价值
//a 数组存放当前解各物品选取情况;max:记录最大价
//a[i]=0 表示不选第 i 件物品,a[i]=1 表示选第 i 件物品
int main()
{
readdata();
search(0);
printresult();
//读入数据
//递归搜索
Word 资料
}
void search(int m)
{
if(m>=n)
checkmax(); //检查当前解是否是可行解,若是则把它的价值与 max
比较
else
{
a[m]=0;
search(m+1); //递归搜索下一件物品
a[m]=1; //不选第 m 件物品
search(m+1); //递归搜索下一件物品
//不选第 m 件物品
}
}
void checkmax()
{
int i, weight=0, value=0;
for(i=0;i<n;i++)
{
if(a[i]==1)
{
//如果选取了该物品
weight = weight + w[i]; //累加重量
Word 资料
value = value + v[i]; //累加价值
}
}
if(weight<=c)
if(value>max)
max=value;
//若为可行解
//且价值大于 max
//替换 max
}
void readdata()
{
int i;
for(i=0;i<n;i++)
scanf("%d%d",&w[i],&v[i]); //读入第 i 件物品重量和价值
}
void printresult()
{
printf("%d",max);
}
2. 装载问题
有两艘船,载重量分别是 c1、 c2,n 个集装箱,重量是 wi (i=1…n),且所有集
装箱的总重量不超过 c1+c2。确定是否有可能将所有集装箱全部装入两艘船。
提示:求出不超过 c1 的最大值 max,若总重量-max < c2 则能装入到两艘船。
3. 堡垒问题(ZOJ1002)
Word 资料
如图城堡是一个 4×4 的方格,为了保卫城堡,现需要在某些格子里修建一些堡
垒。城堡中的某些格子是墙,其余格子都是空格,堡垒只能建在空格里,每个堡
垒都可以向上下左右四个方向射击,如果两个堡垒在同一行或同一列,且中间没
有墙相隔,则两个堡垒都会把对方打掉。问对于给定的一种状态,最多能够修建
几个堡垒。
程序主要部分如下:
int main()
{
readdata();
search(0);
//读入数据
//递归搜索
printresult();
}
void search(int m)
{
int row, col;
row=m/n;
col=m%n;
if(m>=n*n)
checkmax();
max 比较
else
//求第 m 个格子的行号
//求第 m 个格子的列号
//检查当前解是否是可行解,若是则把它的价值与
{
Word 资料
search(m+1);
if(canplace(m))
{
//该位置不放堡垒递归搜索下一个位置
//判断第 m 个格子是否能放堡垒
place(m); //在第 m 个格子上放置一个堡垒
search(m+1); //递归搜索下一个位置
takeout(m); //去掉第 m 个格子上放置的堡垒
}
}
}
5. 8 皇后问题
在一个8×8的棋盘里放置8个皇后,要求这 8 个皇后两两之间互相都不“冲突”。
#include <stdio.h>
#include <math.h>
void search(int);
void printresult();
int canplace(int,int);
void place(int,int);
void takeout(int,int);
int a[8];
//打印结果
//判断该位置能否放置皇后
//在该位置能否放置皇后
//把该位置放置皇后去掉
//a[i]存放第 i 个皇后的位置
int main()
{
search(0); //递归搜索
Word 资料
剩余63页未读,继续阅读
资源评论
不吃鸳鸯锅
- 粉丝: 8225
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功