POJ1745Divisibility(dp)
Description
Consider an arbitrary sequence of integers. One can place + or - operators between integers in the sequence, thus deriving different arithmetical expressions that evaluate to different values. Let us, for example, take the sequence: 17, 5, -21, 15. There are eight possible expressions: 17 + 5 + -21 + 15 = 16
17 + 5 + -21 - 15 = -14
17 + 5 - -21 + 15 = 58
17 + 5 - -21 - 15 = 28
17 - 5 + -21 + 15 = 6
17 - 5 + -21 - 15 = -24
17 - 5 - -21 + 15 = 48
17 - 5 - -21 - 15 = 18
We call the sequence of integers divisible by K if + or - operators can be placed between integers in the sequence in such way that resulting value is divisible by K. In the above example, the sequence is divisible by 7 (17+5+-21-15=-14) but is not divisible by 5.
You are to write a program that will determine divisibility of sequence of integers.
Input
The first line of the input file contains two integers, N and K (1 <= N <= 10000, 2 <= K <= 100) separated by a space.
The second line contains a sequence of N integers separated by spaces. Each integer is not greater than 10000 by it's absolute value.
Output
Write to the output file the word "Divisible" if given sequence of integers is divisible by K or "Not divisible" if it's not.
Sample Input
4 7
17 5 -21 15
Sample Output
Consider an arbitrary sequence of integers. One can place + or - operators between integers in the sequence, thus deriving different arithmetical expressions that evaluate to different values. Let us, for example, take the sequence: 17, 5, -21, 15. There are eight possible expressions: 17 + 5 + -21 + 15 = 16
17 + 5 + -21 - 15 = -14
17 + 5 - -21 + 15 = 58
17 + 5 - -21 - 15 = 28
17 - 5 + -21 + 15 = 6
17 - 5 + -21 - 15 = -24
17 - 5 - -21 + 15 = 48
17 - 5 - -21 - 15 = 18
We call the sequence of integers divisible by K if + or - operators can be placed between integers in the sequence in such way that resulting value is divisible by K. In the above example, the sequence is divisible by 7 (17+5+-21-15=-14) but is not divisible by 5.
You are to write a program that will determine divisibility of sequence of integers.
Input
The first line of the input file contains two integers, N and K (1 <= N <= 10000, 2 <= K <= 100) separated by a space.
The second line contains a sequence of N integers separated by spaces. Each integer is not greater than 10000 by it's absolute value.
Output
Write to the output file the word "Divisible" if given sequence of integers is divisible by K or "Not divisible" if it's not.
Sample Input
4 7
17 5 -21 15
Sample Output
Divisible
題意:給你n個數,每兩個數之間你可以任意加減,求的每個和中是否有和可以對k整除,如果有輸出Divisible,否則輸出Not divisible
思路:這道題直接一個二維陣列算出所有的結果在判斷是不現實的。所以我們可以簡化為dp[i][j],找前i個數加減後 對k整除=j是對的。層層推直到最後一個,最後判斷dp[n][0]是否成立就可以了。
狀態轉移方程
當dp[i-1][j]非0時
1,dp[i][t] = 1其中t = ((j + a[i]) % K + K) % K. 說明一下——(j + a[i])%K後 加個K最後再取餘 是為了避免值是負數。
2,dp[i][t] = 1其中t = ((j - a[i]) % K + K) % K.
程式碼:
#include<stdio.h>
#include<iostream>
using namespace std;
bool dp[10001][101];
long long num[10001];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
int a;
scanf("%d",&a);
num[i]=a%k;
}
dp[0][0]=true;
for(int i=1;i<=n;i++)
{
for(int j=k-1;j>=0;j--)
if(dp[i-1][j])
{
dp[i][((j+num[i])%k+k)%k]=1;
dp[i][((k+j-num[i])%k+k)%k]=1;
}
}
if(dp[n][0])
printf("Divisible\n");
else
printf("Not divisible\n");
return 0;
}
相關文章
- 【DP】區間DP入門
- bzoj 3864: Hero meet devil [dp套dp]dev
- 序列 DP
- DP動態規劃-爬塔(雙層dp)動態規劃
- 區間dp
- 狀壓 dp
- 揹包DP
- 狀壓DP
- 換根dp
- SGU 495 Kids and Prizes:期望dp / 概率dp / 推公式公式
- 插頭dp初探
- DP rman backup scripts
- [dp 小計] SOSdp
- Codeforces 372B Counting Rectangles is Fun:dp套dp
- 【DP】斜率優化初步優化
- 動態規劃(DP)動態規劃
- 【數位dp】學習
- ubuntu for DP tools installUbuntu
- 概率DP入門題
- 【DP】編輯距離
- [筆記]樹形dp筆記
- 【DP】最大正方形
- DP學習筆記筆記
- 斜率最佳化 DP
- 瘋狂學習——DP!
- ZROJ#398. 【18提高7】隨機遊走(期望dp 樹形dp)隨機
- Codeforces 486D Valid Sets:Tree dp【n遍O(n)的dp】
- 樹形DP二三知識
- 斜率優化DP總結優化
- 概率DP總結 by kuangbin
- HDU 3853 LOOPS(概率dp)OOP
- linux DP link建立Linux
- 高維字首和(SOS DP)
- 關於一些基礎的dp——硬幣的那些事(dp的基本引入)
- SPOJ GSS3 (動態dp)S3
- 插頭DP學習筆記筆記
- Android適配:DP簡述Android
- 淺談斜率最佳化DP