zoukankan      html  css  js  c++  java
  • 【洛谷P5020】货币系统 完全背包

    题目大意:给定 N 个数,求在这 N 个数中至少选出几个数能表示出所有数字,输出最少的个数。

    题解:由于只有小的数字可以表示大的数字,因此首先需要对这 N 个数字进行从小到大排序。排序之后就变成一道不定个数的数字组合问题,即:完全背包思想。遍历每一个数字,若该数字不能由之前的数字表示出来,则将答案加一,并将这个数字能够表示的数字进行记录即可。

    代码如下

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=110;
    const int maxv=25010;
    
    int n,ans,a[maxn];
    bool f[maxv];
    
    void read_and_parse(){
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    	sort(a+1,a+n+1);
    }
    
    void solve(){
    	for(int i=1;i<=n;i++)if(!f[a[i]]){
    		++ans,f[a[i]]=1;
    		for(int j=a[i];j<=a[n];j++)f[j]|=f[j-a[i]];
    	}
    	printf("%d
    ",ans);
    }
    
    int main(){
    	int T;scanf("%d",&T);
    	while(T--){
    		memset(f,0,sizeof(f));
    		memset(a,0,sizeof(a));
    		ans=0;
    		read_and_parse();
    		solve();
    	}
    	return 0;
    }
    
  • 相关阅读:
    第一阶段站立会议7
    人机交互—对win10自带输入法的评价
    个人工作总结15
    构建之法阅读笔记06
    个人工作总结14
    第十三周工作总结
    个人工作总结13
    《梦断代码》阅读笔记02
    个人工作总结12
    小水王
  • 原文地址:https://www.cnblogs.com/wzj-xhjbk/p/9946963.html
Copyright © 2011-2022 走看看