1286 最佳存储

 
描述

设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。若要存放程序i, 需要占用磁带的长度为Li,1<= i <= n。现在想请同学们设计一个存储方案,使得能够在磁带上存储尽可能多的程序。在保证存储最多程序的前提下还要求磁带的利用率达到最大。

输入

第一行为一个整数T,表示有T组测试数据。

对于每组测试数据,第一行是正整数L (不超过106),表示磁带的长度;第二行是正整数n (不超过100),表示有n个程序;第三行是n个正整数(每个数的数值不超过100),第i个数的数值Li表示存储它需要占用的磁带长度为Li,每个数用空格分开。

输出

对于每组测试数据,第一行是一个正整数,表示磁带能存储的最多程序个数;第二行是一个正整数,表示磁带存储的这些程序所占的总的磁带长度。

样例输入
1
60
10
2 3 8 10 12 13 16 21 23 80
样例输出
6
60

 

动态规划,类似于背包问题

#include <stdio.h>
#include <string.h>
main()
{
	int number,te;
	long int l;
	int a[101];
	int n;
	int i;
	int j;
	int cnt[10001];
	int sum;
	scanf("%d",&number);

	for(te=1;te<=number;te++)
	{  
		memset(cnt,0,sizeof(cnt));

		scanf("%ld",&l);
		scanf("%d",&n);
		for(i=1;i<=n;i++)
			scanf("%d",&a[i]);
  
		sum=0; 
		for(i=1;i<=n;i++)
			sum+=a[i];

		if(sum<l)
			l=sum;
		if(sum==l)
		{
			printf("%d\n",n);
			printf("%d",sum);
			goto ABC;
		}
        for(i=1;i<=n;i++)
			for(j=l;j>=0;j--)
			{
				if(cnt[j-a[i]]+1>cnt[j]&&j-a[i]>=0)
					cnt[j]=cnt[j-a[i]]+1;
				else
					cnt[j]=cnt[j];
			}


			for(j=l;j>=0;j--)
				if(cnt[j]!=0)
					break;



				  printf("%d\n",cnt[j] );

				printf("%d",j);

		
			






ABC: printf("\n");
	}
}


 

你可能感兴趣的:(测试,存储)