题意:用n个硬币买价值为m的东西,输出使用方案,使得正好几个硬币加起来价值为m。求字典序最小方案
思路:
一开始看着m只有100,暴搜结果T了一个1分的测试点。然后dp记节点+dfs跑字典序最小路径 结果T了个4分的测试点…
太菜了啊 最后这题还是看了题解
解释看注释
#include<iostream>
#include<algorithm>
#include<string.h>
#include<map>
#include<queue>
#include<cmath>
#include<cstdio>
#include<vector>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1e4+5;
int a[maxn],dp[maxn],choice[maxn][105];
bool cmp(int a,int b)
{
return a>b;
}
int n,m;
void Print()
{
int i=n,j=m;
while(j)
{
if(choice[i][j])
{
printf("%d",a[i]);
j-=a[i];
if(j)
printf(" ");
}
i--;
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n,cmp);
for(int i=0;i<n;i++)
{
for(int j=m;j>=a[i];j--)
{
if(dp[j]<=dp[j-a[i]]+a[i])//因为取了等号,且硬币排序是从大到小,所以越往后字典序越小
{
choice[i][j]=1;
dp[j]=dp[j-a[i]]+a[i];
}
}
}
if(dp[m]!=m)
printf("No Solution");
else
Print();
return 0;
}

本文探讨了使用n种硬币购买价值为m物品的问题,通过动态规划算法找到字典序最小的支付方案。介绍了从暴力搜索到DP优化的过程,最终实现高效求解。
624

被折叠的 条评论
为什么被折叠?



