1. 程式人生 > >洛谷P1164 小A點菜

洛谷P1164 小A點菜

otto 描述 個數字 -c const getc txt adf 分析

題目描述

不過uim由於買了一些輔(e)輔(ro)書,口袋裏只剩MM元(M \le 10000)(M10000)。

餐館雖低端,但是菜品種類不少,有NN種(N \le 100)(N100),第ii種賣a_iai?(a_i \le 1000)(ai?1000)。由於是很低端的餐館,所以每種菜只有一份。

小A奉行“不把錢吃光不罷休”,所以他點單一定剛好吧uim身上所有錢花完。他想知道有多少種點菜方法。

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

輸入格式:

第一行是兩個數字,表示NN和MM。

第二行起NN個正數a_iai?(可以有相同的數字,每個數字均在10001000以內)。

輸出格式:

一個正整數,表示點菜方案數,保證答案的範圍在intint之內。

輸入輸出樣例

輸入樣例#1:
4 4
1 1 2 2
輸出樣例#1:
3

題意:

  中文題意,不作解釋。

分析:

  0-1背包求方案數。把狀態轉移方程,dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]),改成:dp[i][j]+=dp[-1]、dp[i][j]+=dp[i][j-w[i]]+v[i]。

技術分享圖片
///  author:Kissheart  ///
#include<stdio.h>
#include
<algorithm> #include<iostream> #include<string.h> #include<vector> #include<stdlib.h> #include<math.h> #include<queue> #include<deque> #include<ctype.h> #include<map> #include<set> #include<stack> #include<string> #define
INF 0x3f3f3f3f #define FAST_IO ios::sync_with_stdio(false) const double PI = acos(-1.0); const double eps = 1e-6; const int MAX=1e6+10; const int mod=1e9+7; typedef long long ll; using namespace std; #define gcd(a,b) __gcd(a,b) inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;} inline ll qpow(ll a,ll b){ll r=1,t=a; while(b){if(b&1)r=(r*t)%mod;b>>=1;t=(t*t)%mod;}return r;} inline ll inv1(ll b){return qpow(b,mod-2);} inline ll exgcd(ll a,ll b,ll &x,ll &y){if(!b){x=1;y=0;return a;}ll r=exgcd(b,a%b,y,x);y-=(a/b)*x;return r;} inline ll read(){ll x=0,f=1;char c=getchar();for(;!isdigit(c);c=getchar()) if(c==-) f=-1;for(;isdigit(c);c=getchar()) x=x*10+c-0;return x*f;} //freopen( "in.txt" , "r" , stdin ); //freopen( "data.txt" , "w" , stdout ); int n,m; int a[MAX]; int dp[105][10005]; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=0;i<=n;i++) dp[i][0]=1; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { dp[i][j]+=dp[i-1][j]; if(j>=a[i]) dp[i][j]+=dp[i-1][j-a[i]]; } } printf("%d\n",dp[n][m]); return 0; }
View Code

洛谷P1164 小A點菜