除去花里胡哨的表层题干,其实可以简化为:
若有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♪(・ω・)ノ