HDU 2126

来源:互联网 发布:163邮箱 ssl smtp端口 编辑:程序博客网 时间:2024/05/17 01:25

如有错误,欢迎大神指出!




这又是一道变种的01背包问题,可以加多一维数组代表方案。

解释在代码里面,接下来ac code:

#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <cstdlib>#include <cmath>#include <vector>#include <list>#include <deque>#include <queue>#include <iterator>#include <stack>#include <map>#include <set>#include <algorithm>#include <cctype>using namespace std;#define si1(a) scanf("%d",&a)#define si2(a,b) scanf("%d%d",&a,&b)#define sd1(a) scanf("%lf",&a)#define sd2(a,b) scanf("%lf%lf",&a,&b)#define ss1(s)  scanf("%s",s)#define pi1(a)    printf("%d\n",a)#define pi2(a,b)  printf("%d %d\n",a,b)#define mset(a,b)   memset(a,b,sizeof(a))#define forb(i,a,b)   for(int i=a;i<b;i++)#define ford(i,a,b)   for(int i=a;i<=b;i++)typedef long long LL;const int N=1100001;const int M=6666666;const int INF=0x3f3f3f3f;const double PI=acos(-1.0);const double eps=1e-7;int a[35],dp[505][2],n,m;int main(){    int t;    si1(t);    while(t--)    {        si2(n,m);        mset(dp,0);        forb(i,0,n)        si1(a[i]);        forb(i,0,m)        dp[i][1]=1;//开始方案为1,dp【i】【0】代表购买数量,dp【i】【1<span style="font-family: Arial, Helvetica, sans-serif;">】代表购买方案数量</span>
        forb(i,0,n)        {            for(int j=m;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];//方案传递                }            }            //printf("%d\n",dp[m-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;}


0 0
原创粉丝点击