HDU - 2126 Buy the souvenirs

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

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
/****************************************************************************************************************
                题意:一个变形的 0/1 背包,n个物品,m元钱,每个物品最多买一次,
                        问最多可以买几件物品,并且输出方案数。
                思路:
                1,加一维表示已经买几件物品。
                2,用了一个数组dp[v][2] ,dp[v][0] 储存原本要记录的 dp ,即最多能买多少种
                   而 dp[v][1] 则记录方案数目。记住需要初始化,把所有 dp[i][1] 都设置成1
                3,体会:
                    用了网上的 C 提交了一下,发现 run time是0;
                    然后用自己的C++提交了一下,发现 run time是31MS.
                    以后试试使用C的输入输出,果然会快很多呢!!!!!!
****************************************************************************************************************/
int a[35];
int dp[505][2];
int main()
{
    int T,N,V;
    cin>>T;
    while(T--)
    {
        cin>>N>>V;
        for(int i = 1;i <= N;i ++)
            cin>>a[i];
        memset(dp,0,sizeof(dp));
        for(int i = 0;i <= V;i ++)  dp[i][1]=1;

        for(int i = 1;i <= N;i ++){
            for(int j = V;j >= a[i];j --){
                if(dp[j][0] == dp[j-a[i]][0]+1)
                    dp[j][1]+=dp[j-a[i]][1];
                else if(dp[j][0] < dp[j-a[i]][0]+1){
                    dp[j][0]=dp[j-a[i]][0]+1;
                    dp[j][1]=dp[j-a[i]][1];
                }
            }
        }
        if(dp[V][0])
            cout<<"You have "<<dp[V][1]<<" selection(s) to buy with "<<dp[V][0]<<" kind(s) of souvenirs."<<endl;
        else
            cout<<"Sorry, you can't buy anything."<<endl;
    }
    return 0;
}



 

posted on 2016-04-23 23:29  Jstyle  阅读(118)  评论(0编辑  收藏  举报

导航