Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
145542 | 韩立鹏 | 邮票面值问题 | C++ | 通过 | 100 | 80 MS | 252 KB | 1187 | 2024-05-05 14:17:43 |
#include <iostream> #include <algorithm> using namespace std; #define inf 1145141919 #define MAXLEN 19 int value[MAXLEN]; int n, k; int mmax = 0; int result[MAXLEN]; int dp[MAXLEN*MAXLEN]; void dfs(int x) { if(x == k) { // 最大的能够拼凑的价值是n张最大的邮票的价值 int maxlen = n*value[k-1]; dp[0] = 0; dp[1] = 1; int i; for(i=2; i<=maxlen; i++) { int min = inf; for(int j=0; j<k; j++) { if(i-value[j] >= 0) { if(dp[i-value[j]]+1 < min) { min = dp[i-value[j]] + 1; } } } dp[i] = min; // 如果找到第一个不能拼凑出的值 if(dp[i] > n) { break; } } // 保存面值的结果 if(i > mmax) { mmax = i; for(int j=0; j<k; j++) { result[j] = value[j]; } } } else { // 第i张邮票的面值不能超过n*【第i-1张邮票的面值】+1 for(int i=value[x-1]+1; i<=value[x-1]*n+1; i++) { value[x] = i; dfs(x+1); } } } int main() { cin>>n>>k; value[0] = 1; dfs(1); for(int i=0; i<k; i++) { cout<<result[i]<<" "; } cout<<mmax-1<<endl; return 0; }