HDU - 2126 Buy the souvenirs(01背包+路径个数)

题意

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

思路

01背包输出路径数量;
用两个一维数组,一个更新最优解,另一个更新最优解对应的路径数;

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=35,M=505;

int cost[N];
int dp[M][2];//dp[i][0]更新最优解,dp[i][1]更新最优解对应的路径数

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=0; i<n; i++)
            scanf("%d",&cost[i]);

        for(int i=0; i<=m; i++)
        	dp[i][0]=0,dp[i][1]=1;					//起点处初始化为1;
        
        for(int i=0; i<n; i++)
            for(int j=m; j>=cost[i]; j--)
            {
                if(dp[j][0]==dp[j-cost[i]][0]+1)	//当前解与最优解相同,路径叠加
                    dp[j][1]+=dp[j-cost[i]][1];
                    
                if(dp[j][0]<dp[j-cost[i]][0]+1)		//更新最优解与路径
                {
                    dp[j][0]=dp[j-cost[i]][0]+1;
                    dp[j][1]=dp[j-cost[i]][1];
                }
            }

        if(dp[m][0])								//最优解不为0
            printf("You have %d selection(s) to buy with %d kind(s) of souvenirs.\n",dp[m][1],dp[m][0]);
        else
            printf("Sorry, you can't buy anything.\n");
    }
    return 0;
}

发布了22 篇原创文章 · 获赞 21 · 访问量 2179

猜你喜欢

转载自blog.csdn.net/qq_44086097/article/details/104224387