【2019杭電多校訓練賽】HDU6685 / 1006-Rikka with Coin 題解(暴力枚舉)

【2019杭電多校訓練賽】HDU6685 / 1006-Rikka with Coin 題解

題目來自於:HDU6685 Rikka with Coin在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述

題意

題目的大意是給你10,20,50,100四種硬幣,你最少要帶多少個硬幣才能喫到其中的任一道菜並且沒有找零

解題思路

這題有一個極限貪心的思想,我們知道會出現以下情況:

  • 只能出現兩個10元硬幣,因爲10,10,10的情況必然可以換成10,20
  • 只能出現三個20元硬幣,因爲20,20,20,20的情況必然可以換成10,20,50
  • 只能出現一個50元硬幣,因爲50,50的情況必然可以換成100

這樣我們就可以用窮舉法來寫這道題目。

#include <iostream>
#include <stdio.h>
#include <queue>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <algorithm>
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
const ll mod=998244353;
const int maxn=1e6+100;

int a[200];

int jud(int i10,int i20,int i50,int num) {
	for(int i=0; i<=i10; i++) {
		for(int j=0; j<=i20; j++) {
			for(int k=0; k<=i50; k++) {
				if(i*10+j*20+k*50==num)return 1;
			}
		}
	}
	return 0;
}

int main() {
//    freopen("in1.txt","r",stdin);
//    freopen("out.txt","w",stdout);
	int t;
	scanf("%d",&t);
	while(t--) {
		int n,flag=0;
		scanf("%d",&n);
		for(int i=1; i<=n; i++) {
			scanf("%d",&a[i]);
			if(a[i]%10!=0)flag=1;
		}
		if(flag==1) {
			printf("-1\n");
			continue;
		}
		int minans=INF;
		for(int i=0; i<=1; i++) { //10
			for(int j=0; j<=3; j++) { //20
				for(int k=0; k<=1; k++) { //50
					int cnt=0;
					int ans=-1;
					for(int l=1; l<=n; l++) {
						int s=a[l]/100;
						if(a[l]%100==0 && a[l]>=100 && jud(i,j,k,100)==1) {
							s--;
						} else if(a[l]%100==10 && a[l]>100 && jud(i,j,k,110)==1) {
							s--;
						} else if(jud(i,j,k,a[l]%100)==0)break;
						cnt=l;
						ans=max(ans,s+i+j+k);
					}
					if(cnt==n) {
						minans=min(minans,ans);
					}
				}
			}
		}
		printf("%d\n",minans);
	}
	return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章