ZOJ1520

这道题是到网上看到的,说是动态规划的,01背包问题,看看之后觉得不像啊,好像没有要求求解最优的存放问题,知识背景差不多罢了,没有必要按照01背包去求解,先看下这道题的意思吧,说是有两种巧克力,不能混合存放,而且要求每个盒子都要放满,但是巧克力是可以剩余的。要是有多种方式的话,只需要输出其中的一种即可。第一种巧克力的存放盒子的个数,然后输出哪些盒子。

 

分析:可以从第一个盒子进行遍历(i->N),放或者不放,内层循环从i开始到N(j=i->N),其中i代表第一个存放的盒子。这样循环遍历下来就可以涵盖所有的情况了。当存放第一种巧克力个数的总和出现如下情况:使用第i个盒子装不满,判断剩余的空盒子能否不空着装第二种巧克力,满足的话输出该种情况。该过程中记录存放的盒子。

 

代码:

#include 
#include 
using namespace std;

int main()
{
	int M,L,N,i,j,sum,total,count;//total表示存放第一种巧克力的总量。
	int c[2001];
	int path[2001];//标记路径


	while(cin>>M&&cin>>L)
	{
		if(M==0&&L==0)
			break;
		else
		{
			sum=0;
			cin>>N;
			for(i=1;i<=N;i++)
			{
				cin>>c[i];
				sum+=c[i];
			}
			if (sum>M+L)//该种情况下不能存满
			{
				cout<<"Impossible to distribute"<M)
							continue;
						total+=c[j];
						count++;
						path[j]=1;
					}
					
					if(sum-total<=L)//满足条件了
						break;
				}
			if(i>N)
				cout<<"Impossible to distribute"<


 

你可能感兴趣的:(个人)