1087 动态规划

#include <stdio.h>
#include <string.h>

/************************************************************************/
/* the number of the value in each line                        */
/************************************************************************/
#define VALUENUM 6
#define MAXNUM 20000
#define MAXVALUE VALUENUM*MAXNUM

/************************************************************************/
/* This function is to printf as the determine result   */
/************************************************************************/
int ResultPrint(int lineindex, int detres)
{
 printf("Collection #%d:\n",lineindex);
 if (detres == 1)
 {
  printf("Can be divided.\n\n");
 }
 else
  printf("Can't be divided.\n\n"); 

 return 1;
}

/************************************************************************/
/* this function is to determine whether the line can be divided     */
/************************************************************************/
int DetermineLine(int Value[VALUENUM], int ValueSum)
{
 int flag[MAXVALUE];//this flag array is to record the flag during the process
 int maxdiv = 0;
 int SerDiv = 0;//the middle value of the summation of the value
 int i=0,j=0,k=0;
 
 SerDiv = ValueSum/2;
 
 memset(flag,0,sizeof(flag));
 flag[0] = 1;
 
 //这里分阶段进行了分析,也就是动态规划。
 for (i=0; i<VALUENUM; i++)
 {
  if (Value[i])
  {
   for (j=maxdiv; j>=0; j--)
   {
    if (flag[j])
    {
     for (k=1; k <= Value[i]; k++)
     {
      maxdiv += (i+1)*k;
      if (maxdiv == SerDiv)
      {
       return 1;
      }
      else if (maxdiv > SerDiv)
      {
       maxdiv = SerDiv;
      }
      else 
      {
       flag[maxdiv] = 1;
      }
     }
    }
   }
  }
 }
 
 return -1;
}


/************************************************************************/
/* this function is to get the input data                             */
/************************************************************************/
int ReadInputFile()
{
 FILE *fp;

 int lineindex = 0; //this is the index of the line
 int value[VALUENUM];//this is the array to record the number of the six kinds of marbles with different value from 1 to 6
 int valuesum = 10;//this variable is to present the summation of the value in each line
 int detres = 0;
 int i = 0;
 //char ch;

 fp = fopen("test.txt","r");
 if (fp == NULL)
 {
  printf("Open the input file failed! \n");
  return -1;
 }

 while (valuesum)
 {
  lineindex++;
  valuesum = 0;
  for (i=0; i<VALUENUM; i++)
  {
   scanf("%d",value+i);
   valuesum += (value[i] * (i+1));
  }

  if (valuesum == 0)
  {
   //printf("this is the last line of the file!\n");
   return -1;
  }
  else if(valuesum%2)
  {
   ResultPrint(lineindex,-1);
  }
  else
  {
   detres = DetermineLine(value,valuesum);
   ResultPrint(lineindex,detres);
  }
 }

 return 1;
}

void main()
{
 ReadInputFile();
}

 

今天写的程序,提交报结果错误,不知道是什么问题,我已经验证了一些数据都是对的啊。

里面的动态规划思想还是蛮好的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值