贪心的题做的太少,碰到一点感觉都没有。 也是看了别人的题解才做。
对于此题,位数越长,那么数吧必定最大,那么cnt=v/mmin 就得到了最多的位数,那么最优的答案位数已经确定了。接下来就是相当于,我有cnt个空格,让你填1~9,9个数字,在满足限定条件的情况下,我要求最大值。这样子问题是不是一下变得很简单了呢? 限定条件是: 当前我取的数 对应的 值 不能超过总钱,并且选了这个数后,后面的位数不能受到影响,即位数不变。外层循环从cnt-1~0,内层循环9~1 满足条件就输出,高位的数字越大,肯定答案越大。
/*If I get TLE , it is good.If I get AC,it's NICE !*/
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
const int MAXN=1e6+100;
int a[15]={0};
int main(void)
{
int v;
cin >> v;
int mmin=MAXN;
int maxcnt=0;
for(int i=1;i<=9;i++)
{
scanf("%d",&a[i]);
mmin=min(mmin,a[i]); // 求出最小的费用,确定位数
}
if(v<mmin)
{
printf("-1\n");
return 0;
}
maxcnt=v/mmin;
//其实下面的过程对位数的判断如果没想过可能一下子想不到,其实也就相当于把当前位后面的数字全遮掉,在限定条件下,然后去求最大可填的数字。
for(int i=maxcnt-1;i>=0;i--)
{
for(int j=9;j>=1;j--)
{
if(a[j]<=v && (v-a[j])/mmin >= i)
{
printf("%d",j);
v-=a[j];
break;
}
}
}
puts("");
}