codevs 1047 邮票面值设计

来源:互联网 发布:orange软件怎么用 编辑:程序博客网 时间:2024/04/29 13:26
#include<iostream>
using namespace std;
int dp[1000005],a[50];
int inf=1e9;
int n,k,ans[50],mx=0;
直接暴力不重复枚举所有情况,然后更新即可。

void solve()
{
for (int i=1;;i++)
{
dp[i]=inf;
for (int j=1;j<=k && i>=a[j];j++)
dp[i]=min(dp[i],dp[i-a[j]]+1);
if (dp[i]>n) 
{
if (i-1>mx)
{
mx=i-1;
for (int o=1;o<=k;o++)
ans[o]=a[o];//
}//只有i-1>mx才更新,但只要dp[i]>n就return;
return ;
}
}
}




void dfs(int i)
{
if (i==k)
{
solve();
return ;
}
for (int j=a[i]+1;j<n*a[i]+2;j++)//这个范围很神。
{
a[i+1]=j;
dfs(i+1);
}
}


int main()
{
cin>>n>>k;
if (n>10||k>10)
return 0;
a[1]=1;
dfs(1);
for (int i=1;i<=k;i++)
cout<<ans[i]<<' ';
cout<<endl<<"MAX="<<mx<<endl; 
}
1 0
原创粉丝点击