p1164 小A点菜 题解——背包初步

传送门

除去花里胡哨的表层题干,其实可以简化为:

      若有m个东西,每取一个要K个代价,问若要求取出数据的代价为n的方案数是多少

其实是01背包的一种变式(反正我就是这么认为的,不对又怎样,打我啊)

我认为还是挺好想的(但身为冻柜蒟蒻的我,还素选择写下这份题解OTZ)

假若说f[j]是你选前i种东西而用j个价格的方案数

以一个for循环控制i,以第二个for循环控制填满j

具体内容详见代码及注释

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int f[10001]; 
 5 int v[1001];
 6 int main(){
 7     int n;int m;
 8     scanf("%d%d",&n,&m);//n->几种菜。m->要花的钱 
 9     f[0]=1; 
10     for(register int i=1;i<=n;i++) scanf("%d",&v[i]);//每种菜要花的价格 
11     for(register int i=1;i<=n;i++){
12         for(register int j=m;j>=v[i];j--){
13             f[j]=f[j]+f[j-v[i]];
14             /*
15                {f[j]是代表前i个种类的食品用了之后花完j元的方案数
16                Dp方程代表着我点第I个菜(f[j-v[i]])和不点第I个菜(f[j])一共的方案数
17                 当只花费0元在第I个菜时,只有一种买菜方案
18                当花完M元时,输出方案数
19                } 
20                —————————————————————————— 
21                {循环
22                1>>代表的是前I种食物
23                2>>代表的是用J元
24                整体就是前I种食物花费J元的方案数
25                } 
26                ——————————————————————————
27                
28             */
29         }
30     }
31     cout<<f[m];
32     return 0;//功德圆满 
33 }

有什么错误劳烦指出,Thanks♪(・ω・)ノ

猜你喜欢

转载自www.cnblogs.com/fallen-down/p/10425072.html
今日推荐