题目描述 已知硬币总价值S 给你n种不同的硬币 面值分别为ai 求出组成总面值硬币个数的最小值以及最大值。
input |
输入数据有多组 每组数据有硬币种数n,总价S和n种硬币面值 |
output |
输出对应每组输入的硬币数目的最小值和最大值 |
sample_input |
3 3 1 2 3 5 30 1 3 5 7 9 |
sample_output |
1 3 4 30 |
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int main()
{
int n,s;
int data[110];
int dpmin[10010]; //记录达到总面值为i时候的所使用硬币个数的最大值或最小值
int dpmax[10010];
while(~scanf("%d%d",&n,&s))
{
memset(data,0,sizeof(data));
for(int i=1;i<=s;i++)
{
dpmin[i]=10001;
dpmax[i]=-10001;
}
for(int i=0;i<n;i++)
scanf("%d",&data[i]);
dpmin[0]=0,dpmax[0]=0;
for(int i=1;i<=s;i++)// i表示当前钱数
{
for(int j=0;j<n;j++)//硬币种类循环
{
if(data[j]<=i)
dpmin[i]=min(dpmin[i-data[j]]+1,dpmin[i]);
if(data[j]<=i)
dpmax[i]=max(dpmax[i-data[j]]+1,dpmax[i]);
}
}
/*
for(int i=1;i<=s;i++)
cout<<dpmin[i]<<" ";
cout<<endl;
*/
cout<<dpmin[s]<<" "<<dpmax[s]<<endl;
}
return 0;
}