您的位置:首页 > 其它

codeforces 3B Lorry 贪心

2012-12-07 15:47 423 查看
背包问题的贪心,因为每个物品的重量是1或是2,最优组合也是1和2物品的组合,所以枚举重量是1的物品的组合和重量是2的物品的组合的组合,选最优的组合即可

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define size 5;
struct node{
int p;
int id;
};
node v1[100005],v2[100005];
int q;
int s1[100005],s2[100005];
int cmp(const void*a,const void*b)
{
node*c=(node*)a;
node*d=(node*)b;
if(c->p < d->p)
return 1;
else
return -1;
}
int main()
{
int i,j,k,l,m,n,v;
int n1=0,n2=0;
memset(s1,0,sizeof(s1));
memset(s2,0,sizeof(s2));
scanf("%d %d",&n,&v);
for(i=1;i<=n;i++)
{
scanf("%d %d",&j,&m);
if(j==1)
{
v1[n1].id=i;
v1[n1++].p=m;
}
else
{
v2[n2].id=i;
v2[n2++].p=m;
}
}
qsort(v1,n1,sizeof(v1[0]),cmp);
qsort(v2,n2,sizeof(v2[0]),cmp);
s1[0]=0;s2[0]=0;
s1[1]=v1[0].p;s2[1]=v2[0].p;
for(i=1;i<n1;i++)
{
s1[i+1]=v1[i].p+s1[i];
}
for(i=1;i<n2;i++)
{
s2[i+1]=v2[i].p+s2[i];
}
int max[3]={-1,-1,-1};
int t1,t2;
for(i=0;i<=n1;i++)
{
int t2;
if(i>v)
break;
t2=(v-i)/2;
if(t2>n2)
t2=n2;
if(s1[i]+s2[t2]>max[0])
{
max[0]=s1[i]+s2[t2];
max[1]=i;
max[2]=t2;
}
}
printf("%d\n",max[0]);
for(i=0;i<max[1];i++)
printf("%d ",v1[i].id);
for(i=0;i<max[2];i++)
printf("%d ",v2[i].id);
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: