ACM 350. 小吃店(揹包變形)

350. 小吃店

★☆   輸入文件:food.in   輸出文件:food.out   簡單對比
時間限制:1 s   內存限制:256 MB

小吃店

【背景】

    小白終於決定了去小吃店的方案。來到小吃店的小白被琳琅滿目的小吃看得直流口水。他對自己說:我一定要把錢全部用來買小吃!!但是小白最近在減肥,所以他不希望吃太多,他給自己又定了一個量,他希望正好達到這個量,不能多也不能少。假設每種最多買一份。

【問題描述】

    給出n個數對(ai,bi),每個數對都滿足ai>=bi。要求在這n個數對中選出k對,使得ai1+ai2+ai3+……+aik=m且bi1+bi2+bi3+……+bik=w,k爲任意數,有幾種方案。

【輸入文件】

第一行有三個整數n,m,w。
接下來n行每行二個整數ai,bi。

【輸出文件】

方案總數。

【輸入輸出樣例】

food.in
4 3 2
2 1
3 2
1 1
2 1
food.out
3

樣例解釋
{1,3}、{2}和{3,4} (這裏的數字表示第幾對)

【數據範圍】

對於 30%數據, 0<=n<=10; 0<=m,w<=100
對於100%數據, 0<=n<=50; 0<=m,w<=2,500
對於 100%數據,0<=ai,bi<=100
保證運算和輸出不會超過maxlongint

#include <iostream>
#include <cstdio>

using namespace std;

#define MAX_N 2501
#define INF -999999

int n,m,w;
int dp[MAX_N][MAX_N];
int a[MAX_N],b[MAX_N];

int main()
{
    freopen("food.in","r",stdin);
    freopen("food.out","w",stdout);

    scanf("%d%d%d",&n,&m,&w);

    for(int i=0;i<n;i++) scanf("%d%d",&a[i],&b[i]);

    for(int i=0;i<=m;i++)
    dp[0][0]=1;

    for(int i=0;i<n;i++)
    {
        for(int j=m;j>=a[i];j--)
        {
            for(int k=w;k>=b[i];k--)
            {
                dp[j][k]+=dp[j-a[i]][k-b[i]];
            }
        }
    }

    printf("%d\n",dp[m][w]);

    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章