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