CF44B Cola

本文探讨了如何利用背包算法和优化策略解决购买n升可乐的最优化方案问题,通过实例展示了如何避免暴力枚举并减少计算复杂度,特别是在处理0.5升可乐的特殊性时的技巧。

有a瓶0.5升,b瓶1升,c瓶2升的可乐,求买n升可乐的方案数

输入 n , a, b , cc ( 1<=n<=10000 , 0<=a,b,c<=50000<=a,b,c<=5000 ).


1.这道题先想到的是背包问题,真的好像,最近刚学了背包,真的希望能派上用处,但是写的时候忽略了一点,二维浮点型数组-对数组元素操作的时候有对行或者列的引用,比如

max(dp[i][j],dp[i-1][j-v[i]+w[i])

2.换一种思考方式枚举,真的好暴力,n给的是1e4,三个for循环依次枚举1e4^3=1e12>1e9(1亿)


3.能不能只枚举两次,我们这里发现0.5L为最小单元,2*0.5=1,4*0.5=2,我们想能不能枚举后两个,与给出的体积做差值,如果=或者>0,那么说明必定能行,但在这里还有一个bug,那就是0.5的数量,我们这里要特判一下如果0.5的总数量*0.5L>总体积-枚举1L和2L的体积-->剩余的容积是否比0.5L的总体积要小,如果大的话就代表放不完


#include<iostream>
using namespace std;
int  cnt;
int main()
{
	int v;
	int n1,n2,n3;
	cin>>v>>n1>>n2>>n3;
	for(int i=0;i<=n2;i++)
	{
		for(int j=0;j<=n3;j++)
		{
			int a=v-i*1-j*2;
			if(n1*0.5>=a&&a>=0) cnt++;
		 } 
	}
	  if(cnt==0) cout<<0;
            else cout<<cnt;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值