A36 贪心算法 P5020 [NOIP2018 提高组] 货币系统

视频链接:86 贪心算法 [NOIP2018 提高组] 货币系统_哔哩哔哩_bilibili

 

 

Luogu P5020 [NOIP2018 提高组] 货币系统

#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

int n,a[105],f[25005],ans;
//f[j]表示j能被已知数字拼凑的方案数

int main(){
  int T; scanf("%d",&T);
  while(T--){
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
      scanf("%d",&a[i]);
    sort(a+1,a+n+1);
    
    memset(f,0,sizeof(f));
    f[0]=1; 
    for(int i=1; i<=n; i++)
      for(int j=a[i];j<=a[n];j++)
        f[j]+=f[j-a[i]];
    
    ans=0;
    for(int i=1;i<=n;i++)
      if(f[a[i]]==1) ans++;    
    printf("%d\n",ans);
  }
}

 

#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

int n,a[105],f[25005],ans;

int main(){
  int T; scanf("%d",&T);
  while(T--){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
      scanf("%d",&a[i]);
    sort(a+1,a+n+1);
    
    memset(f,-63,sizeof f);
    f[0]=0; 
    for(int i=1;i<=n;i++)
      for(int j=a[i];j<=a[n];j++)
        f[j]=max(f[j],f[j-a[i]]+1);
        
    ans=0;  
    for(int i=1;i<=n;i++)
      if(f[a[i]]==1) ans++;
    printf("%d\n",ans);
  }
  return 0;
}

 

Luogu P1616 疯狂的采药

 

Luogu P3951 [NOIP2017 提高组] 小凯的疑惑

设 a<b,答案为 x
若 x≡ma(mod b) (1≤m≤b−1)
即 x=ma+nb (1≤m≤b−1)

当 n≥0 时,x 可以用 a,b 表示出来,不合题意。

因此当 n=−1 时 x 取得最大值,此时 x=ma−b。
显然当 m 取得最大值 b−1 时,x 最大,
此时 x=(b−1)a−b=ab−a−b。

#include <iostream>
using namespace std;

int main(){
  long long a,b;
  cin>>a>>b;
  cout<<a*b-a-b<<endl;
  return 0;
}

 

posted @ 2023-09-11 08:00  董晓  阅读(250)  评论(0编辑  收藏  举报