每日一题(小白)动态规划篇9

每日一题(小白)动态规划篇9_第1张图片

遇见难题最主要是什么?最重要的就是读懂题意我们可以这样想,相当于大叔卖包子,每个笼子放的数量不同,顾客可能提出各种各样的要求,现在我们已经知道大叔一共有多少种笼子数目,要我们去求出大叔能不能满足的顾客,如果不能满足的顾客无限多就输出INF。

每日一题(小白)动态规划篇9_第2张图片每日一题(小白)动态规划篇9_第3张图片

每日一题(小白)动态规划篇9_第4张图片类似于此如果有1肯定是满足所有的,如过是2和3肯定能满足2+2,2+3,3+3,2+2+2,2+2+3。。。等,也就是说我们永远是在满足的条件上依次去加接下来的包子,fx=2出现的次数递增+3出现的次数递增。反过来想如果满足的一定是依次递减为fx的,所以fx=fx+f(x-2)+f(x-3);顾客要求为x,总能在任意x-2或x-3的条件下满足,则是满足x的,如果不能满足就输出x即可。思考完成开始操作

①接收笼子种类数和每笼的容量

	static int N=(int)1e5;
	static int dp[]=new int[N];
	static int num[]=new int[102];
	static int count=0;
	public static void main(String[] args) {
			Scanner scan=new Scanner(System.in);
			int x=scan.nextInt();
			for (int i = 1; i <= x; i++) {
				num[i]=scan.nextInt();
			    dp[num[i]]++;
			}
			for (int i = 1; i < N; i++) {//大循环
				for (int j = 1; j <= x; j++) {//小循环,给定的笼子数
					if (i-num[j]<0) {//我要的包子数目比你的笼子都要小,换一个笼子
						continue;//换
					}
					dp[i]=dp[i]+dp[i-num[j]];//递归精髓,请好好思考~
					if (dp[i]!=0) {//数字已经变动,说明有符合条件的搭配
						break;
					}
				}
				if (dp[i]==0) {//数字未变动
					count++;
				}
			}
			if (count>10000) {//测试数据到5000就够用了,在不确定的情况下开大点
				System.out.println("INF");
			}else {
				System.out.println(count);//输出凑不出的数字			}
			scan.close();

    }

自己研究不明白动态规划再看下面!!!

我们最初把所有可能的笼子数目已经复制给大数组,大数组里面可能的选项是1不可能的选项是0;拼接能拼接出来dp【i】必定不为0;同样被拼接出来的不为零dp【i】又可以为其他的数字做拼接

所有就有了我们的公式dp【i】=dp【i】+dp【i-num【j】】  

你可能感兴趣的:(动态规划,算法,开发语言,java)