思路:先排序 颜料优先 同等颜料 数值大的在前
得到一个最小 的数字 (设颜料值为x,颜料成为颜料A)
然后用v去买。。。买v/x次, 余下v%x颜料 ------(v/k已经是能写的最多的个数)
然后从9到1 (数值优先)(称颜料B)
开始贪心 ------(在最多个数已经确定的前提尽量选数值大的颜料)
即 如果颜料A+余下的钱能买B,则去掉A买B,同时余下的颜料减去B-A的颜料
一直贪到无法再替换 就是正确答案
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <set>
#include <vector>
using namespace std;
struct node
{
int x;
int val;
}tm[20],nm[20];
int cmp(node a,node b)
{
if(a.val!=b.val)
return a.val<b.val;
else
return a.x>b.x;
}
int cmp2(node a,node b)
{
return a.x>b.x;
}
node buy[15];
int main()
{
int v;
int i;
cin>>v;
int copv=v;
int ok=0;
for (i=1;i<=9;i++)
{
tm[i].x=i;
scanf("%d",&tm[i].val);
nm[i].x=i;
nm[i].val=tm[i].val;
}
sort(tm+1,tm+1+9,cmp);
sort(nm+1,nm+1+9,cmp2);
if (v<tm[1].val)
{
printf("-1\n");
return 0;
}
buy[++ok].x=tm[1].x;
while (v>=tm[1].val)
{
v-=tm[1].val;
buy[ok].val++;
}
if (v!=0)
{
int last=1;
for (i=1;i<=9;i++)
{
if (v<=0) break;
if (nm[i].x<tm[last].x) continue;
while (nm[i].x>tm[last].x&&tm[last].val+v>=nm[i].val)
{
if (buy[1].val>0)
buy[1].val--;
else
{
break;
}
buy[1+ok].x=nm[i].x;
buy[1+ok].val++;
v-=(nm[i].val-tm[last].val);
}
ok++;
}
}
sort(buy+1,buy+1+ok,cmp2);
int j;
for (i=1;i<=9;i++)
{
if (buy[i].val!=0)
{
for (j=1;j<=buy[i].val;j++)
printf("%d",buy[i].x);
}
}
printf("\n");
return 0;
}