有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;
}