All pastes #276596 Raw Edit

Untitled

public text v1 · immutable
·published 2006-12-12 14:56 UTC
rendered paste body
//#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#define MAXITEMS 105
#define MAXKNAPSIZE 10005
typedef struct s
{
	int item,value,size,qty;
	int fincnt;
}Item;

int N,A,B;
Item array[MAXITEMS],copy[MAXITEMS];
Item save[MAXITEMS];
int cost[MAXKNAPSIZE],prev[MAXKNAPSIZE],best[MAXKNAPSIZE],count[MAXKNAPSIZE];

int compare(const void* a, const void* b) // based on size
{
	if( (*(Item*)a).size > (*(Item*)b).size )
		return 1;
	else if( (*(Item*)a).size < (*(Item*)b).size )
		return -1;
	return 0;
}
int comp(const void* a, const void* b) //based on item id
{
	if( (*(Item*)a).item > (*(Item*)b).item )
		return 1;
	else if( (*(Item*)a).item < (*(Item*)b).item )
		return -1;
	return 0;
}

FILE *fp;
void trace()
{
	int i;
	fp = stdout;
	for(i=1;i<=B;i++)
		fprintf(fp,"%d ",cost[i]);
	fprintf(fp,"\n\n");
	for(i=1;i<=B;i++)
			fprintf(fp,"%d ",prev[i]);
	fprintf(fp,"\n\n");
	for(i=1;i<=B;i++)
		fprintf(fp,"%d ",best[i]);
	fprintf(fp,"\n\n");
	for(i=1;i<=B;i++)
		fprintf(fp,"%d ",count[i]);
	fprintf(fp,"\n\n");
}
int main()
{
	int i,j,k,M,sum=0,max=0,masssum=0,flag=0,p=0,mx=0;
	//clrscr();
	scanf("%d %d %d",&N,&A,&B);
//	fp = fopen("knap.txt","w");
	M=B;
	for(i=1;i<=N;i++)
	{
		array[i].item = i;
		array[i].fincnt = 0;
		scanf("%d %d %d",&array[i].value,&array[i].size,&array[i].qty);
		masssum += (array[i].value*array[i].qty);
	}
	for(i=1;i<=N;i++)
	{
		if(array[i].size<=B)
		{
			flag=1;
			break;
		}
	}
	if(flag==0||masssum<A)
	{
		printf("-1\n");
		return 0;
	}
	qsort(array,N+1,sizeof(Item),compare);
	for(j=1;j<=N;j++)
	{
		for(i=array[j].size;i<=M;i++)
		{
			int X = cost[i-array[j].size] + array[j].value;
			if(cost[i]<X)
			{
				p = best[i-array[j].size]==j?count[i-array[j].size]:0;
				if(p+1<=array[j].qty)
				{
					cost[i] = X;
					prev[i] = i-array[j].size;
					best[i] = j;
					count[i] = p+1;
				}
				else
				{
					if(cost[i-1]>cost[i-array[j].size])
						mx = i-1;
				    else
						mx = i-array[j].size;
					cost[i] = cost[mx];
					prev[i] = prev[mx];
					best[i] = best[mx];
					count[i] = count[mx];
				}
			}
		}
		//trace();
		//printf("\n Iteration Over!!");
		//getch();
	}
  
	for(k=B;k>=A;k--)
	{
		sum = 0;
		for(i=1;i<=N;i++)
			array[i].fincnt=0;
		for(i=k;;i=prev[i])
		{
			array[best[i]].fincnt++;
			if(prev[i]==0)
				break;
		}
		for(i=1;i<=N;i++)
			sum += (array[i].value*array[i].fincnt);

		if(sum>max)
		{
			max=sum;
			for(p=1;p<=N;p++)
				save[p] = array[p];
		}
	}
	if(max>0)
	{
		printf("%d\n",max);
		qsort(save,N+1,sizeof(Item),comp);
		for(i=1;i<=N;i++)
			printf("%d\n",save[i].fincnt);
	}
	else
		printf("-1\n");
	return 0;
}