P5020货币系统
这个题是2018提高组真题,是一道看不出是背包的背包题。 题干特别长,甚至有些没看懂。题意为给出一组货币面值,然后从这里面用最少的面值数量取代原先的面值。比如3,6直接用3表示。一开始想到了小凯的疑惑想两两一组求最高不能表示的数,发现根本不是。发现只要看原先的面值是否可以用比他小的面值来替代,那么这个面值就可以取消了,顿时发现这是一个完全背包!容量为最大的数,dp[]表示最多能被几张已有面值代替,cash就表示体积,那么状态转移方程就是 dp[j]=dp[j],dp[j-cash[i]]+1 ;到最后再统计dp[cash[i]]=1的就代表无法被代替,累加输出即可。再在上面进行一个初始化即AC。 1.审题要专心,如果看不懂就结合样例,去上下文进行判断,别羽墨。 2.进行初始化的memset慎用,另外,这里的 dp[i]不可以初始化为0 ,因为方程是+1,所以有好多表示不出来的可能会+1,注意长度。 3.要把复杂的动态规划往背包等有模型的上面转化,但也不可以抓住不放,eg.大凯的疑惑,, 代码: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<algorithm> 6 using namespace std; 7 int T; 8 int n,m; 9