标签:组合 cin with lag pac end 思想 hdoj ref
首先10元的硬币最多只会用一个,如果用了两个,直接替换成一个10元、一个20元一定不亏。
20元的硬币最多只会用三个,如果用了四个,直接替换成一个10元、两个20元、一个50元一定不亏。
50元的硬币最多只会用一个,如果用了两个,直接替换成个50元和一个100元一定不亏。
对于每个价格,我们优先判断是否不小于100, 然后我们再把其拆出 (%100后的部分) + 100 和 若干个100进行组合,判断i个10和j个20和k个50能否组成 (%100后的部分) + 100,不能则再判断能否组成 (%100后的部分), 然后每次判断最多需要多少个100, 将16种情况枚举完取最小的答案。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int INF=0X3F3F3F3F;
int n;
int w[101];
bool judge(int n,int i1,int j1,int k1){
for(int i=0;i<=i1;i++){
for(int j=0;j<=j1;j++){
for(int k=0;k<=k1;k++){
if(i*10+j*20+k*50==n){
return true;
}
}
}
}
return false;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin>>t;
while(t--){
cin>>n;
bool flag=true;
for(int i=0;i<n;i++){
cin>>w[i];
if(w[i]%10!=0){
flag=false;
}
}
if(!flag){
cout<<-1<<endl;
continue;
}
int ans=INF;
for(int i=0;i<=1;i++){//50
for(int j=0;j<=3;j++){//20
for(int k=0;k<=1;k++){//10
int cnt=0;
int sum=-INF;
for(int m=0;m<n;m++){
if(w[m]>=100&&judge(w[m]%100+100,i,j,k)){
cnt=w[m]/100-1;
}else if(judge(w[m]%100,i,j,k)){
cnt=w[m]/100;
}else cnt=INF;
sum=max(sum,cnt);//最多需要的1美元的个数
}
ans=min(ans,sum+i+j+k);
}
}
}
cout<<ans<<endl;
}
return 0;
}
标签:组合 cin with lag pac end 思想 hdoj ref
原文地址:https://www.cnblogs.com/GarrettWale/p/11396988.html