子数组和问题,和被10整除

类似问题:子数组和被所有元素的个数整除

给你一个数组,要求找出一个子数组,使得该子数组的和可以被10整除。例如,下面的数组中,子数组A[3]+A[4]+A[9] mod 10 = 0.


思路:

用动态规划。

状态空间定义如下:s(m,k)表示数组A的前m个元素中,是否存在一个子数组,该子数组的和除以10得到的余数是k。s(m,k)=true表示存在;s(m,k)=false表示不存在。

状态转移:s(m,k) = s(m-1,k) || s(m-1, (k-A[m-1]+10)%10)

设数组A总共有n个元素。那么s(n,0)就表示了所求子数组的存在性。

代码:

/* Program to find LCA of n1 and n2 using one traversal of Binary Tree */
#include <iostream>
#include <vector>
#include <string>
using namespace std;

#include <stdio.h>
#include <stdlib.h>

bool divideBy10(int arr[], int n)
{
	vector<bool> table_row(10, false);
	vector<vector<bool> > table(n, table_row);

	// Trivial case: sub-array is empty, 0 is dividable by any integer
	// Therefore, the resulting sub-array should contain at least 1 element.
	table[0][arr[0]%10]=true;// Base case: arr[0]%10

	for(int i=1; i<n; i++)
		for(int j=0; j<10; j++)
		{
			int k=j;
			while(k<arr[i])
				k = k+10;//make sure k is greater than or equal to arr[i]
			table[i][j] = table[i-1][j] || table[i-1][ (k-arr[i])%10 ];
		}

	return table[n-1][0];
}


int main()
{
	int arr[]={429, 334, 62, 711, 704, 763, 98, 733, 721, 995};
	//int arr[]= {1,2,3,4,5};
	if(divideBy10(arr, sizeof(arr)/sizeof(int)) )
		cout<<"fffffffffffff"<<endl;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值