https://nanti.jisuanke.com/t/40403
这时计蒜客的题目链接,大家如果想看英文题目可以去看一下,嘿嘿,当然这里我会把题目大致意思写出来,就是给你一个数额,让你用给定的纸币金额来组成这个数额,在输出每种纸币用的数量,而且要可能的用面值大的纸币,且要尽可能少的纸币,这题就是背包题加上路径输出,但是唯一一点不同的是这题要尽可能的用面值大的,所以在第一层for用数额,在里面用纸币数额来遍历这样就可以把尽可能大的纸币数额用上了,就是一点思维,慢慢培养吧。
这是AC代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 2050;
int v,n;
int a[N];
int minv[N];
int vis[N];
int min_coin[N];
int main()
{
while(~scanf("%d%d",&v,&n))
{
if(n == 0 && v == 0)
{
break;
}
for(int i = 1;i <= n;i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+1+n);
memset(vis,0,sizeof(vis));
for(int i = 1;i <= v;i++)
{
minv[i] = 0x3f3f3f3f;
}
minv[0] = 0;
for(int j = 1;j <= v;j++)
{
for(int i = 1;i <= n;i++)
{
if(j >= a[i])
{
if(minv[j] > minv[j - a[i]] + 1)
{
minv[j] = minv[j - a[i]] + 1;
min_coin[j] = i;//这里是保存路径
}
}
}
}
if(minv[v] == 0x3f3f3f3f)//这就是没有找到一种合理方案
{
printf("-1\n");
continue;
}
while(v)
{
vis[min_coin[v]]++;//这里是记录个数来保存路径
v-=a[min_coin[v]];
}
printf("%d",vis[1]);
for(int i = 2;i <= n;i++)
{
printf(" %d",vis[i]);
}
printf("\n");
}
}