提交时间:2024-05-05 11:02:50
运行 ID: 145512
#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<<endl<<"MAX="<<mmax-1<<endl; return 0; }