思路:
这个题就是求能恰好构成 >= 给出钱数的最小值和最小硬币数量,且能支付的钱最少为第一优先级。
就是一个恰好装满的01背包问题
dp[j] 表示 恰好能组成 j元钱所花费的最小硬币数
求出dp数组后,我们从给出的价值V开始遍历,找到第一个 恰好能由硬币组成的且大于V的值,并将组成它的最小硬币数输出即可
#include <bits/stdc++.h>
#define ss system("pause");
using namespace std;
const int maxn = 1e2 + 5;
const int maxc = 1e6 + 5;
const int inf = 1e9 + 7;
int dp[maxc],v[maxn];
void Solve(int bag,int num,int c)
{
for(int i = 1; i <= bag; i++) dp[i] = inf;
dp[0] = 0;
for(int i = 1; i <= num; i++){
for(int j = bag; j >= v[i]; j--){
dp[j] = min(dp[j - v[i]] + 1,dp[j]);
}
}
for(int i = c; i <= bag; i++){
if(dp[i] < inf){
cout<<i<<' '<<dp[i]<<endl;
break;
}
}
}
int main()
{
int t;
cin>>t;
while(t--){
int C,n;
cin>>C>>n;
int sum = 0;
for(int i = 1; i <= n; i++){
cin>>v[i];
sum += v[i];
}
Solve(sum,n,C);
}
return 0;
}