一道算法题

djjlove_2008 2014-09-14 08:06:41


如图,请给出详细解答。
...全文
267 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Flammable_ice 2014-09-15
  • 打赏
  • 举报
回复
小弟不才,分别用贪心和动态规划算法写了一段C代码,看看是否正确?

#include <iostream>
#include <time.h>
using namespace std;
#define n 10
void DP(int array[],int M)//动态规划
{
	int i,j,a[n][n]={0};
	for (i=0;i<n;i++)
	{
		a[i][i]=array[i];
	}
	for (i=0;i<n;i++)
	{
		for (j=i+1;j<n;j++)
		{
			a[i][j]=a[i][j-1]+array[j];//DP递归式
			if (a[i][j]==M)
			{
				cout<<"从"<<i<<"到"<<j<<"项等于M"<<endl;
			}
		}
		cout<<endl;
	}
}
void DP2(int array[],int M)//贪心
{
  int i=1,s=array[0],start=0,end=0;
  while(1)
  {
	  if (s<M)//如果小于M且下标i没到数组末尾,则继续求和,否则说明无满足题意的和式。
	  {
		  end=i;
		  s+=array[i++];
		  if (i>n)
		  {
			  break;
		  }
	  }
	  else if (s==M)
	  {
		  cout<<"从"<<start<<"到"<<end<<"项等于M"<<endl;
		  break;
	  }
	  else
	  {
		  s-=array[start];//如果和超过了M,舍弃前面的某几项,直到小于等于M为止
		  start++;
	  }
  }
}
int main()
{
	srand((unsigned int)time(NULL)); 
    int array[n] = {0};
	for (int i=0;i<n;i++)
	{
		array[i]=rand()%30;
		cout<<array[i]<<" ";
	}
	cout<<endl;
	DP(array,100);
	DP2(array,100);
    return 0;
}
Flammable_ice 2014-09-15
  • 打赏
  • 举报
回复
把A[i]到A[j]之和放入一个表中,如果该表中有等于M的项,那么表示有解,如果可能的话,还可以记录具体的i和j的位置。
Flammable_ice 2014-09-15
  • 打赏
  • 举报
回复
目测“你所给出的算法”应该是一个动态规划算法。“进一步用O(n)时间”估计可以用贪心来求解。
taodm 2014-09-14
  • 打赏
  • 举报
回复
尼玛,果断google 背包9讲 吧。
Pandorym 2014-09-14
  • 打赏
  • 举报
回复
int i = 1, j= 1, x = 0;
while( x!=m && j<=n )
  if (x<m) 
  {
    x += A[j];
    j++;
  }
  eles 
  {
    x -= A[i];
    i++;
  }
不懂分析..

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧