nyoj106揹包問題


描述

現在有很多物品(它們是可以分割的),我們知道它們每個物品的單位重量的價值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

其實這道題看的時候沒有認真讀題,錯以爲是有好幾個同樣的物品可以放進揹包,以致我不會做題了

後老才發現那價值是各個物品的戴維重量的價值 這樣一看題目就更不難了 以此來提醒我自己 要好好讀題!!!!


<pre name="code" class="cpp">#include <stdio.h>
struct Beibao
{
	int v;//題意中v爲每個物品的單位重量的價值
	int w;//每個物體的總重量
};
int main()
{
	int k;
	Beibao a[11],t;
	scanf("%d",&k);
	while(k--)
	{
		int s,m;
		scanf("%d%d",&s,&m);//s爲物品件數 m爲總限重
		int i,j;
		for(i=0;i<s;i++)
			scanf("%d%d",&a[i].v,&a[i].w);
		for(i=0;i<s-1;i++)
			for(j=i+1;j<s;j++)
			{
				if(a[i].v<a[j].v)
				{
					t=a[i];
					a[i]=a[j];
					a[j]=t;
				}
			}
			int x=0,y=0;
			for(i=0;i<s;i++)
			{
				if((x+a[i].w)<m)
				{
					x=x+a[i].w;
					y=y+a[i].w*a[i].v;
				}
				else
				{
					y=y+(m-x)*a[i].v;//重量加起來不超過限重的就直接計算價值 超過或等於了就分隔算一下在原來價值的基礎上又能增加多少 求總和即可
					break;
				}
			}
			printf("%d\n",y);
	}
	return 0;
}
					






發佈了41 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章