题目来源:码蹄集
题目描述:
Python代码实现:
from sys import stdin
def main():
x, *val = map(int, input().split())
dp = [0] * 1010
MOD = int(1e9 + 7)
dp[0] = 1
for i in range(1, x + 1):
for j in range(3):
if i - val[j] >= 0:
dp[i] += dp[i - val[j]]
dp[i] %= MOD
if dp[x] > 0:
print(dp[x])
else:
print("impossible")
if __name__ == "__main__":
main()
C++代码实现:
参考链接:https://yxsmarter.blog.csdn.net/article/details/128211350?spm=1001.2014.3001.5502
#include <bits/stdc++.h>
using namespace std;
#define mem(a) memset(a, 0, sizeof(a))
#define dbg(x) cout << #x << " = " << x << endl
#define fi(i, l, r) for (int i = l; i < r; i++)
#define cd(a) scanf("%d", &a)
typedef long long ll;
ll dp[1010] = {1, 0};
const ll mod = 1e9 + 7;
int main() {
int x;
int val[3];
cin >> x;
for (int i = 0; i < 3; i++) {
cin >> val[i];
}
for (int i = 1; i <= x; i++) {
for (int j = 0; j < 3; j++) {
if (i - val[j] >= 0) {
dp[i] += dp[i - val[j]];
dp[i] %= mod;
}
}
}
if (dp[x]) {
cout << dp[x] << endl;
}
else {
puts("impossible");
}
return 0;
}
Java代码实现:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long[] dp = new long[1010];
final long MOD = (long) 1e9 + 7;
int x = sc.nextInt();
int[] val = new int[3];
for (int i = 0; i < 3; i++) {
val[i] = sc.nextInt();
}
dp[0] = 1;
for (int i = 1; i <= x; i++) {
for (int j = 0; j < 3; j++) {
if (i - val[j] >= 0) {
dp[i] += dp[i - val[j]];
dp[i] %= MOD;
}
}
}
if (dp[x] > 0) {
System.out.println(dp[x]);
} else {
System.out.println("impossible");
}
}
}
代码提交测试结果:
附B站老师讲解链接,可供参考:https://www.bilibili.com/video/BV1ih4y1x7su/?t=353.9