Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
145424 冼俊烨 邮票面值问题 C++ 通过 100 193 MS 288 KB 1195 2024-05-05 08:10:01

Tests(4/4):


#include <bits/stdc++.h> using namespace std; const int MAXN=51; int n,k,f[MAXN]= {0,1},stamp[MAXN],MAX; void Dfs(int idx) { if(idx>k) //所有邮票都试完了 { int dp[5100]= {0}; int i=0; while(dp[i]<=n) //如果之前的邮票数超过n,不可行,就没必要继续了 { i++; //下个位置 dp[i]=0x3f3f3f3f; //dp[i]表示已知面值的邮票组合出面值为i所需要的最小邮票数 for(int j=1; j<=k && i-f[j]>=0; j++)//枚举k种邮票,并且可以尝试这种邮票 dp[i]=min(dp[i],dp[i-f[j]]+1); } if(i-1>MAX) { memcpy(stamp,f,sizeof(f)); //复制当前的最优解 MAX=i-1; } return; } for(int i=f[idx-1]+1; i<=f[idx-1]*n+1; i++) { f[idx]=i; //尝试另一个面值 Dfs(idx+1); } } int main() { scanf("%d%d",&n,&k); Dfs(2); //第一张邮票是1,从第二张邮票开始 for(int i=1; i<=k; i++) printf("%d ",stamp[i]); printf("%d\n",MAX); return 0; }


测评信息: