hdu2126(求方案数的01背包)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2126

题意: n个物品,m元钱,每个物品最多买一次,问最多可以买几件物品,并且输出方案数。

分析:一看就想到01背包,不过得加一维来表示能买的物品件数。dp[i][j]表示在i元内至多能买j件物品。则状态转移方程为:dp[i][j]+=dp[i-a[k][j-1].

最后把在1~m元内买到的最大件数mx加起来就是题目所求。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <stack>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 1000000007
#define inf 0x3f3f3f3f
#define N 1000010
#define clr(a) (memset(a,0,sizeof(a)))
using namespace std;
int dp[510][50],a[50];
int n,m;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        clr(dp);
        dp[0][0]=1;
        int mx=0;
        for(int i=1;i<=n;i++)
        for(int j=m;j>=a[i];j--)
        {
            for(int k=n-1;k>=0;k--)
            {
                if(dp[j-a[i]][k])dp[j][k+1]+=dp[j-a[i]][k],mx=max(mx,k+1);
            }
        }
        if(mx==0)
        {
            puts("Sorry, you can‘t buy anything.");
            continue;
        }
        int ans=0;
        for(int i=0;i<=m;i++)ans+=dp[i][mx];
        printf("You have %d selection(s) to buy with %d kind(s) of souvenirs.\n",ans,mx);
    }
}

时间: 2024-10-18 01:16:53

hdu2126(求方案数的01背包)的相关文章

hdu 2126 Buy the souvenirs(记录总方案数的01背包)

Buy the souvenirs Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1662    Accepted Submission(s): 611 Problem Description When the winter holiday comes, a lot of people will have a trip. Genera

HDU 2126 01背包(求方案数)

Buy the souvenirs Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1886    Accepted Submission(s): 699 Problem Description When the winter holiday comes, a lot of people will have a trip. Genera

洛谷 P1064 金明的预算方案【DP/01背包-方案数】

题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家--餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:"随便点". 题目描述 不过uim由于买了一些辅(e)辅(ro)书,口袋里只剩M元(M<=10000). 餐馆虽低端,但是菜品种类不少,有N种(N<=100),第i种卖ai元(ai<=1000).由于是很低端的餐馆,所以每种菜只有一份. 小A奉行"不把钱吃光不罢休",所以他点单一定刚好吧uim身上所有钱

背包问题求方案数

问题描述: 解法: 我们让 dp[i] 代表 背包体积恰好为 i 时背包的最大价值 ,再定义一个 g[i] 代表体积为 i 的时候总价值最大的最优选法方案数 这里注意 dp 的含义与之前的 01背包有点不同,所以我们初始化的时候也需要注意   (具体的可以看之前 01背包详讲) 统计方案数的时候得看它是从之哪个体积转移过来的 int n,m; int dp[1010],g[1010]; int main() { cin >> n >> m; dp[0] = 0; for (int

POJ 1552 BUY LOW, BUY LOWER(最长单调递减子序列求方案数)

BUY LOW, BUY LOWER Time Limit: 1000MS   Memory Limit: 30000K       Description The advice to "buy low" is half the formula to success in the bovine stock market.To be considered a great investor you must also follow this problems' advice: "

P1417 烹调方案(思维+01背包)

(点击此处查看原题) 题意 有n种食材,每种食材有三个属性,ai,bi和ci,如果在t时刻完成第i样食材则得到ai-t*bi的美味指数,用第i件食材做饭要花去ci的时间.问在T时间内,什么样的烹调方案使得美味指数最大,输出最大的美味指数 解题思路 简单看来,这就是一个01背包问题,但是不同之处在于这里每个食材的价值会因为时间而改变,所以对于每个时间点,我们需要考虑此时先选择哪一种食材 记now为当前时间,食材1的属性:a1,b1,c1,食材2的属性:a2,b2,c2 1)先选择食材1的总价值:a

qdu-凑数题(01背包)

Description 小Q手里有n(n<=1000) 个硬币,每枚硬币有一定的金额(200=>x>=1)他想知道,用这些硬币(每枚硬币只能用一次,但可能会有等面值的用两次) 能组成多少种不同的金额? Input 第一行 n,表示第二行一共有n个数字,第二行 表示n个数字 Output 第一行 输出 m, 表示可以组成多少种不同的金额第二行 按照从小到大的顺序输出所有的金额. 注意,每行的结尾,不要有空格,否则你的答案可能会被判错. Sample Input 1 2 1 2 Sample

01背包//简直要被这道题玩死(掀桌)

先上链接: 表格什么的最清楚了:http://blog.csdn.net/mu399/article/details/7722810 dd大大的背包九讲: —————————————————— 01背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ),  f[i-1,j] } f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值. Pi表示第i件物品的价值. 决策:为了背包中物品总价值最大化,第 i件物品应该放入背包中

01背包&amp;完全背包

·01背包&完全背包基础 01背包模型:给定n个物品,第i个物品体积为Wi,价值为Vi,背包容量为sum,选择一些物品放入背包,要求总价值最大. F[i,j]表示前i个物品放入容量为j的包里获得的最大价值. 对于任意一个物品都有两种状态,要么放要么不放,不放的话很显然价值同前,放的话就要从包里拿出一部分体积. 完全背包模型:给定n种物品,第i个物品体积为Wi,价值为Vi,背包容量为sum,选择一些物品放入背包,要求总价值最大. F[i,j]表示前i种物品放入容量为j的包里获得的最大价值. 01背