P1164 小A点菜

 

题目背景

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

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

题目描述

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

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

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

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

输入格式

第一行是两个数字,表示NNN和MMM。

第二行起NNN个正数aia_iai​(可以有相同的数字,每个数字均在100010001000以内)。

输出格式

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

输入输出样例

输入 #1

4 4
1 1 2 2

输出 #1

3


又一道01背包,对于每个菜,可以选择点或不点,dp[i]表示花费i可行的方案数

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define sf(a) scanf("%d\n",&a)
#define rep(i,a,b) for(i=a;i<=b;i++)
#define e 1e-8
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;
const int idata=1e3+5;

int i,j,k;
int judge,flag,temp;
//vectorstep(idata);
ll step[idata];
int dp[idata];
//int valu[30],wigh[30];
ll n,m,t,x,y;
ll maxx=-inf,minn=inf;
ll cnt,len,ans,sum;
priority_queue< int, vector , greater >q;
string s;

int main()
{
    while(cin>>n>>m)
    {
        for(i=1;i<=n;i++)
            cin>>step[i];

        dp[0]=1;//点某个菜时,刚好刚好花费完
        for(i=1;i<=n;i++)
        {
            for(j=m;j>=step[i];j--)
            {
                dp[j]+=dp[j-step[i]];
            }
        }
        cout<

 

你可能感兴趣的:(洛谷,#,背包问题)