nyoj106背包问题为模板解出杭电oj2187悼念512汶川大地震遇难同胞——老人是真饿了

背包问题

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 3
描述
现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<=10);如果给你一个背包它能容纳的重量为m(10<=m<=20),你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大。
输入
第一行输入一个正整数n(1<=n<=5),表示有n组测试数据;
随后有n测试数据,每组测试数据的第一行有两个正整数s,m(1<=s<=10);s表示有s个物品。接下来的s行每行有两个正整数v,w。
输出
输出每组测试数据中背包内的物品的价值和,每次输出占一行。
样例输入
1
3 15
5 10
2 8
3 9
样例输出
65
 #include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct act
{
	int p;
	int num;
}arr[100];
bool cmp( act x,act y)
{
	return x.p>y.p;//贪心思想:总是先装有价值的东西 
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int n,m,i;
		scanf("%d %d",&n,&m);
		for(i=0;i<n;i++)
		{
			scanf("%d %d",&arr[i].p,&arr[i].num);
		}
		sort(arr,arr+n,cmp);
		int sum=0;
		for(i=0;i<n;i++)
		{
		if(m>arr[i].num)//如果总的容量大于最大价值的总容量 
		{
			sum=sum+arr[i].num*arr[i].p;//把最大价值的东西买完; 
			m=m-arr[i].num;//剩下的容量 
		}
		else
		{
			sum=sum+m*arr[i].p;//如果总的容量小于或等于最大价值的总容量 ,就把背包全都装最大价值的东西 
			break;//装填完毕跳出循环 
		}
		}
		printf("%d\n",sum);
	}
	return 0;
}

悼念512汶川大地震遇难同胞——老人是真饿了

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 9973    Accepted Submission(s): 4169


Problem Description
时间:2008年5月16日(震后第4天)
地点:汶川县牛脑寨
人物:羌族老奶奶

【转载整理】牛脑寨是一个全村600多人的羌族寨子,震后几天,这里依然能常常听到隆隆的声音,那是对面山上石头不断滑落的声音。在完成整个突击队的抢修移动基站的任务后,我提着相机开始记录这里的受创情况。
突然,我的视线里出现一个羌族老人,这让我无比的震惊,要知道,那是一个极陡的坡,这个佝偻着腰的老人是怎么艰难地爬上来的?她上来做什么?
nyoj106背包问题为模板解出杭电oj2187悼念512汶川大地震遇难同胞——老人是真饿了_第1张图片
老人背后是极陡的坡,她只有一只眼睛有依稀的视力,望着满地废墟,她徘徊了很久。家在哪里,她极力地用很低的视力找寻着。她曾经的家就在旁边,但是满目废墟已经让老人看不出来。她举目远眺,期望那里能看到家的一点点痕迹。原来家就在旁边,左手抓住一个房橼,努力让自己站住,地震过去三天了,她第一次回到曾经的家。
nyoj106背包问题为模板解出杭电oj2187悼念512汶川大地震遇难同胞——老人是真饿了_第2张图片
一个倒塌的柜子,里面装着一丝希望,老人很吃力地搬动掩盖在柜子上的薪柴。老人找到一把木匠用的刨子,老泪纵横,或许有哪个逝去的亲人是木匠。睹物思人,逝者已矣。
nyoj106背包问题为模板解出杭电oj2187悼念512汶川大地震遇难同胞——老人是真饿了_第3张图片
继续找,一把散碎的挂面出现在我的眼前。她颤颤巍巍地捞起铺满灰尘的挂面,再次流出了眼泪......
看着她仔细地把挂面放进胸前的围腰里,我顿然感觉到,这是老人在得到外援之前赖以生存的口粮了,如果不是交通中断,外部救援进不来,老人家又何必拖着80多岁的躯体,强忍失去亲人的痛苦,重新回到这夺取她亲人生命的废墟,寻找这点点挂面?老人是真饿了......
nyoj106背包问题为模板解出杭电oj2187悼念512汶川大地震遇难同胞——老人是真饿了_第4张图片
老人佝偻着腰,低声喃喃地念着那两句话“你们走了,我可怎么活”,拿着那对我们身处城市的人们微不足道的挂面,远去了......

PS: 拍完这组照片后我才知道,5月14号军用运输飞机第一次给汶川空投救援物资就掉在牛脑寨,受灾的村民们没有占为己有,而是汗流浃背地走了两个小时背到山下的县城交给政府。
--------------------------------------------------------------------------------------------------------

对于幸存的灾民来说,最急待解决的显然是温饱问题,救灾部队一边在组织人员全力打通交通,一边在组织采购粮食。现在假设下拨了一定数量的救灾经费要去市场采购大米(散装)。如果市场有m种大米,各种大米的单价和重量已知,请问,为了满足更多灾民的需求,最多能采购多少重量的大米呢?
 

Input
输入数据首先包含一个正整数C,表示有C组测试用例,每组测试用例的第一行是两个整数n和m(0<n<=1000,0<m&lt;=1000),分别表示经费的金额和大米的种类,然后是m行数据,每行包含2个整数p和h(1<=p<=25,1<=h&lt;=100),分别表示单价和对应大米的重量。
 

Output
对于每组测试数据,请输出能够购买大米的最多重量(你可以假设经费买不光所有的大米)。
每个实例的输出占一行,保留2位小数。
 

Sample Input
       
       
       
       
1 7 2 3 3 4 4
 

Sample Output
       
       
       
       
2.33
 
#include<stdio.h>
#include<algorithm>
using namespace std;
struct rice
{
	int p;
	int num;
};
bool cmp(rice a,rice b)
{
	return a.p<b.p;//问题是固定的钱买最多东西,要多买便宜的 
}
int main()
{
	int T;
	double sum;	//注意 
	rice str[20000];
	scanf("%d",&T);
	while(T--)
	{
		int n,m,i,j;
		scanf("%d %d",&n,&m);
		sum=0;
		for(i=0;i<m;i++)
		{
			scanf("%d",&str[i].p);
			scanf("%d",&str[i].num);
		}
		sort(str,str+m,cmp);
		for(i=0;i<m;i++)
		{
		if(n>str[i].p*str[i].num)
		{	
	
			sum=sum+str[i].num;
			n=n-str[i].p*str[i].num;
		}
		else
		{
			sum=sum+n*1.0/str[i].p;//注意 
			break;
		}
		}
		printf("%.2lf\n",sum);
	}
	return 0;
}


你可能感兴趣的:(nyoj106背包问题为模板解出杭电oj2187悼念512汶川大地震遇难同胞——老人是真饿了)