背包问题之两个例题:Inflate & Building

Problem #1:Inflate

Description

设计一次竞赛使得选手最大可能的得分尽可能高。可供选择的题目共有N类(1 <= N<= 10,000),你可以从每一类题目中选出任意道题或不选组成一次竞赛。某一类题中的每一道题都需要相同的时间并能得到相同的分数。竞赛总时间不超过M分钟(1 <=M <= 10,000)。

Input Format

第一行两个整数M, N分别表示竞赛总时间与题目类数;第2到N+1行每行两个整数,分别表示这类题每一道的分数和所需时间。

Output Format

仅一行,即给定条件下最大可能的得分。

Sample Input

300 4
100 60
250 120
120 100
35 20


Sample Output

605

Source Program

#include <stdio.h>
#include <string.h>
#define MAXNUM 10002
#define MAX(a,b) a>b?a:b

int M;			//竞赛总时间 
int N;			//竞赛题的类别数 
int s[MAXNUM];  //题i的分数 
int t[MAXNUM];  //题i所需的时间 
int f[MAXNUM];   
	
int main()
{
	//freopen("test.in","r",stdin);
	scanf("%d%d",&M,&N);
	for (int i=1; i<=N; i++)
		scanf("%d%d",&s[i],&t[i]);
	memset(f, 0, sizeof(f));
	for (int i=1; i<=N; i++)
		for (int j=0; j<=M; j++)
			if (j<t[i]) f[j]=f[j];
			else f[j]=MAX(f[j], f[j-t[i]]+s[i]);
	printf("%d\n",f[M]);
	//fclose(stdin);
	return 0;
} 





Problem #2:Building

Description

WOW是BLIZZARD公司开发的一款网络游戏,游戏的背景是处在一个叫做艾泽拉斯的神秘大陆上的。在这片陆地上生活着许多不同种族不同部落的奇幻生物,暗夜精灵就是其中的一员。他们拥有高深的科技和强大的魔法,但却因为性格的冷傲孤僻而不被其他种族所接受。为了改善这种状况,半神塞纳留斯决定发展有暗夜精灵族特色的产业来吸引外族,他发现暗夜精灵的建筑风格深受世人青睐,因为它们都是古树的造型,且具有一种神奇的魔力,就是在占地面积不变的情况下可以自由改变形状,使得建筑之间完全没有空隙。

于是,他将这一艰巨的任务交给了部落中最具天赋的工程师守望者玛维,让他在一块面积为n(0<=n<=100)的土地上建造若干个建筑,这些建筑都有各自的占地面积q(0<=q<=100),价格p(0<=w<=100)和魅力值v(0<=v<=100)。就暗夜精灵当前掌握的科技来看,他们可以建造m(0<=m<=100)种建筑,为了不使游客感到乏味,每一种建筑规定最多只能建一座。

你的任务就是替玛维想出一种选择建造的方案,使得最多用k(0<=k<=100)的金钱,在面积为n的土地上建出的建筑具有最高的魅力值。

 

Input Format

第一行有三个数m,n,k;以下有m行,分别包含了m种建筑的占地面积q,价格p和魅力值v。

Output Format

仅有一个数,为最高魅力值。

Input Sample

5 12 11
4 3 3
3 2 6
2 4 2
6 3 7
5 5 6


Sample Output

15

Source Program

#include <stdio.h>
#include <string.h>
#define MAXNUM 101
#define MAX(a,b) a>b?a:b

int m;			//建筑的种类数 
int n;   		//土地的面积   
int k;			//使用的金钱数 
int q[MAXNUM];  //建筑i的占地面积 
int p[MAXNUM];  //建筑i的价格
int v[MAXNUM];	//建筑i的魅力值 
int f[MAXNUM][MAXNUM];  //f表示前i个获得的最大魅力值 

int main()
{
	//freopen("building7.in","r",stdin);
	scanf("%d%d%d",&m,&n,&k);
	for (int i=1; i<=m; i++)
		scanf("%d%d%d",&q[i],&p[i],&v[i]);
	memset(f,0,sizeof(f)); 
	for (int i=1; i<=m; i++)
		for (int j=n; j>=1; j--)
			for (int h=k; h>=1; h--)
				if (j<q[i]||h<p[i]) f[j][h]=f[j][h];
				else f[j][h]=MAX(f[j][h], f[j-q[i]][h-p[i]]+v[i]);
	printf("%d\n",f[n][k]);
	//fclose(stdin);
	return 0;
} 

 
 

 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值