南陽題目106-揹包問題

揹包問題

時間限制: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<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node 
{
	int w,v;
	double p;
}s[10010];
bool cmp(node x,node y)
{
	return x.v>y.v;
}
int main()
{
	int M,n,m,i,j,a,b;
	scanf("%d",&M);
	while(M--)
	{
		scanf("%d%d",&m,&n);
		for(i=0;i<m;i++)
			scanf("%d%d",&s[i].v,&s[i].w);
		
		sort(s,s+m,cmp);
		double sum=0;
		for(i=0;i<m;i++)
		{
			if(s[i].w<=n)
			{
				sum+=s[i].v*s[i].w;
				n-=s[i].w;
			}
			else
			{
				sum+=n*s[i].v;
				break;
			}
		}
		printf("%.0lf\n",sum);
	}
	return 0;
 } 






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章