题目描述:给你n个整数,和一个k值(2<=k<=100),问在这n个数之间的n-1的位置任意放加减号,问有没有一种情况使结果整除k。
dp即可。dp[i][j]
= 1表示在第i个数字时,有一种组合可以使结果模k为j。
易知, -(k -
1) <= j <= k - 1
状态转移:
设x[i]为第i个数字。
dp[i][j]
= dp[i - 1][(j - x[i]) % k] || dp[i - 1][(j x[i]) % k];
注意第一个数字要特判一下,因为第一个数字前没有加减号,或者说:只有加号。
最后只要看dp[n][0]是否等于1,即:到第n个数的时候,有没有组合的结果模k等于0,即整除k。
#include<iostream>
using namespace std;
bool dp[10000][200];
int main()
{
int n, k, x,
mid = 100, temp;
scanf("%d%d", &n, &k);
memset(dp,
0, sizeof(dp));
for(int i =
0; i < n; i )
{
scanf("%d", &x);
if (i == 0)
dp[i][mid x % k] = 1;
else
for(int j = mid - k 1; j <= mid k - 1; j )
{
if (dp[i - 1][j])
{
temp = (j x - mid) % k;
dp[i][temp mid] = 1;
temp = (j - x - mid) % k;
dp[i][temp mid] = 1;
}
}
}
if (dp[n -
1][mid])
printf("Divisible\n");
else
printf("Not divisible\n");
return
0;
}
加载中,请稍候......