All pastes #272949 Raw Edit

Mine

public c v1 · immutable
·published 2006-12-09 13:05 UTC
rendered paste body
#include<stdio.h>#include<stdlib.h>#define MAXITEMS 105#define MAXKNAPSIZE 10005typedef struct s{	int item,value,size,qty;	int fincnt;}Item;Item array[MAXITEMS],copy[MAXITEMS];int save[MAXITEMS];int cost[MAXKNAPSIZE],best[MAXKNAPSIZE];int compare(const void* a, const void* b){	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){	if( (*(Item*)a).item > (*(Item*)b).item )		return 1;	else if( (*(Item*)a).item < (*(Item*)b).item )		return -1;	return 0;}int main(){	int i,j,k,A,B,M,N,currwt =0,s=0,cnt=0,sum=0,max=0,p;	scanf("%d %d %d",&N,&A,&B);	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);	}	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)			{				cnt=0;				for(k=i-array[j].size;cost[k]>0;k-=array[best[k]].size)				{					if(best[k]==j)						cnt++;					else						break;				}				if(cnt+1<=array[j].qty)				{					cost[i] = X;					best[i] = j;				}				else				{					for(s=i;s<=N;s++)					{						cost[i] = cost[s];						best[i] = best[s];						break;					}				}			}		}	}	for(s=1;s<=N;s++)		copy[s] = array[s];	for(k=B;k>=A;k--)	{		for(s=1;s<=N;s++)			array[s] = copy[s];		sum = 0;		//for(i=1;i<=N;i++)		//	array[i].fincnt=0;		currwt = k;		do		{			array[best[currwt]].fincnt++;			currwt -= array[best[currwt]].size;		}while(best[currwt]>0);				qsort(array,N+1,sizeof(Item),comp);		for(i=1;i<=N;i++)		{			if(array[i].fincnt>0)				sum += (array[i].value*array[i].fincnt);		}		if(sum>max)		{			max=sum;			for(p=1;p<=N;p++)				save[p] = array[p].fincnt;		}	}	if(max>0)	{		printf("%d\n",max);		for(i=1;i<=N;i++)			printf("%d\n",save[i]);	}	else		printf("-1\n");	return 0;}