题目背景

uim神犇拿到了uoira(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种。

uim指着墙上的价目表(太低级了没有菜单),说:“随便点”。

题目描述

不过uim由于买了一些辅(e)辅(ro)书,口袋里只剩 MM 元 (M \le 10000)(M≤10000) 。

餐馆虽低端,但是菜品种类不少,有 NN 种 (N \le 100)(N≤100) ,第 ii 种卖 a_iai​ 元 (a_i \le 1000)(ai​≤1000) 。由于是很低端的餐馆,所以每种菜只有一份。

小A奉行“不把钱吃光不罢休”,所以他点单一定刚好吧uim身上所有钱花完。他想知道有多少种点菜方法。

由于小A肚子太饿,所以最多只能等待 11 秒。

输入输出格式

输入格式:

第一行是两个数字,表示 N和 M 。

第二行起 N个正数 ai​ (可以有相同的数字,每个数字均在 10001000 以内)。

输出格式:

一个正整数,表示点菜方案数,保证答案的范围在 int 之内。

输入输出样例

输入样例#1: 复制

4 4
1 1 2 2

输出样例#1: 复制

3

思路

  • DP:好像是01背包的变形(看到好多大佬都是这样说)。用dp数组来记录拿到总价值数为j时的方案数(我是这样理解的,把dp过程打表出来好像也是这样),最后输出dp[m]的方案数就行了。下面是我打的dp过程时的表(数据是样例中的数据)

  • DFS:暴力似乎能解决一切问题(在时间够的情况下)。直接枚举所有的情况,加上剪枝就可以了(这个题加上剪枝并没有减少什么时间,难道是剪枝的姿势不对?)

AC代码

DP:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <limits.h>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <set>
#include <string>
#define ll long long
#define ms(a) memset(a,0,sizeof(a))
#define pi acos(-1.0)
#define INF 0x3f3f3f3f
const double E=exp(1);
const int maxn=1e3+10;
using namespace std;
int a[maxn];
int dp[maxn];//记录拿到总价值为j的物品的方案数
int main(int argc, char const *argv[])
{
ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
ms(dp);
dp[0]=1;
for(int i=1;i<=n;i++)
{
// cout<<"取到第"<<i<<"个物品时"<<endl;
for(int j=m;j>=a[i];j--)
{
dp[j]+=dp[j-a[i]];
// cout<<"i:"<<i<<"\t"<<"j:"<<j<<"\t"<<"a[i]:"<<a[i]<<"\t"<<"dp[j]:"<<dp[j]<<endl;
}
}
cout<<dp[m]<<endl;
return 0;
}

DFS:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <limits.h>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <set>
#include <string>
#define ll long long
#define ms(a) memset(a,0,sizeof(a))
#define pi acos(-1.0)
#define INF 0x3f3f3f3f
const double E=exp(1);
const int maxn=1e6+10;
using namespace std;
int n,m;
int ans;
int a[maxn];
int vis[maxn];//记录这种菜是否选过
void dfs(int x,int y)//x表示选到第几个菜,y表示当前菜的总价值
{
if(y>m)
return ;
if(y==m)
{
ans++;
return ;
}
// 从当前所选的菜的位置向后遍历
for(int i=x+1;i<=n;i++)
{
// 如果当前菜没有被选
if(vis[i]==0)
{
vis[i]=1;
dfs(i,y+a[i]);
// 回溯
vis[i]=0;
}
} }
int main(int argc, char const *argv[])
{
ios::sync_with_stdio(false);
cin>>n>>m;
ms(vis);
ms(a);
for(int i=1;i<=n;i++)
cin>>a[i];
ans=0;
dfs(0,0);
cout<<ans<<endl;
return 0;
}

洛谷 P1164:小A点菜(DP/DFS)的更多相关文章

  1. 洛谷P1164 小A点菜 DP入门

    原题传输门>>https://www.luogu.org/problem/show?pid=1164<< 前几天开始联系DP的,一路水题做到这,发现这题套不了模板了QAQ 在大 ...

  2. 洛谷P1164 小A点菜(01背包求方案数)

    P1164 小A点菜 题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:“随便点”. 题目描述 不过u ...

  3. 洛谷——P1164 小A点菜

    P1164 小A点菜 题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:“随便点”. 题目描述 不过u ...

  4. 洛谷P1164 小A点菜 [2017年4月计划 动态规划08]

    P1164 小A点菜 题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:“随便点”. 题目描述 不过u ...

  5. 洛谷 p1164 小A点菜 【dp(好题)】 || 【DFS】 【恰好完全装满】

    题目链接:https://www.luogu.org/problemnew/show/P1164 题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. u ...

  6. 【洛谷P1164 小A点菜】

    题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:“随便点”. 题目描述 不过uim由于买了一些辅(e ...

  7. 洛谷P1164小A点菜(01背包)

    题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:“随便点”. 题目描述 不过uim由于买了一些辅(e ...

  8. (Java实现)洛谷 P1164 小A点菜

    题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家--餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:"随便点". 题目描述 不过ui ...

  9. 洛谷 P1164 小A点菜

    题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:“随便点”. 题目描述 不过uim由于买了一些辅(e ...

  10. 洛谷P1164小A点菜

    这也是一道01背包的题 用的方法比较的巧妙.这个动态规划相当于反过来做的,自己理解就知道了.代码很短 #include<bits/stdc++.h> using namespace std ...

随机推荐

  1. Java 求两个数百分比%

    int num1 = 500; int num2 = 312; // 创建一个数值格式化对象 NumberFormat numberFormat = NumberFormat.getInstance( ...

  2. js之全局变量与window对象

    所有在全局作用域中声明的变量.函数都会变成window对象的属性和方法. 即: var age = 55; 可以通过window.age访问 然而全局变量和与在window对象上定义的属性还是有一点区 ...

  3. mysql sql_mode=only_full_group_by问题?

    视图查询的时候本地数据库报错: 解决办法: 1.查看sql_mode select @@global.sql_mode STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_Z ...

  4. PAT-GPLT训练集 L1-043 阅览室

    PAT-GPLT训练集 L1-043 阅览室 注意:连续的S和E才算一次借还 代码: #include<iostream> #include<cstdio> using nam ...

  5. eclipse项目环境搭建(做了好多遍,老是忘记,以此文帮助记忆)

    今天把eclipse的环境搭建好(不能用myeclipse好忧伤). 要求: 1.在svn上管理项目,要下载svn插件. 2.是web所以要用到tomcat插件. 3.将项目运行起来. 流程: ecl ...

  6. Cracking The Coding Interview4.8

    //You are given a binary tree in which each node contains a value. Design an algorithm to print all ...

  7. 源码安装nginx 出现fatal error: pcre.h: 没有此文件或者目录

    原因是用了pcre2 重新下载pcre再编译即可.

  8. Batch Normalization 引出的一系列问题

    Batch Normalization,拆开来看,第一个单词意思是批,出现在梯度下降的概念里,第二个单词意思是标准化,出现在数据预处理的概念里. 我们先来看看这两个概念. 数据预处理 方法很多,后面我 ...

  9. L291

    If you are currently in the midst of planning a wedding, then I don't need to tell you how stressful ...

  10. Maven Speed Up

    收录架构 proxy代理仓库 不支持仓库搜索功能 收录版本 所有版本 更新时间 每24小时更新一次 使用说明 一.在maven软件中使用 以Maven 3.5.2为例: 打开maven配置文件 ./a ...