hdu2126---Buy the souvenirs(01背包方案数)
Problem Description And you have only 7 RMB,this time you can select any combination with 3 kinds of souvenirs at most,so the selections of 3 kinds of souvenirs are ABC (6),ABD (7). But if you have 8 RMB,the selections with the most kinds of souvenirs are ABC (6),ABD (7),ACD (8),and if you have 10 RMB,there is only one selection with the most kinds of souvenirs to you: ABCD (10). Input /*************************************************************************
> File Name: hdu2126.cpp
> Author: ALex
> Mail: zchao1995@gmail.com
> Created Time: 2015年03月05日 星期4 21时04分58秒
************************************************************************/
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const double pi = acos(-1);
const int inf = 0x3f3f3f3f;
const double eps = 1e⑴5;
typedef long long LL;
typedef pair <int,int> PLL;
int dp[510];
int dp2[510];
int goods[35];
int main ()
{
int t;
int n,m;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&m);
int all = 0;
for (int i = 1; i <= n; ++i)
{
scanf("%d",&goods[i]);
}
int tmp = m;
sort (goods + 1,goods + 1 + n);
for (int i = 1; i <= n; ++i)
{
if (tmp >= goods[i])
{
++all;
tmp -= goods[i];
}
else
{
break;
}
}
if (!all)
{
printf("Sorry,you can't buy anything.
");
continue;
}
memset (dp,0,sizeof (dp));
for (int i = 0; i <= m; ++i)
{
dp2[i] = 1;
}
for (int i = 1; i <= n; ++i)
{
for (int j = m; j >= goods[i]; --j)
{
if (dp[j] < dp[j - goods[i]] + 1)
{
dp[j] = dp[j - goods[i]] + 1;
dp2[j] = dp2[j - goods[i]];
}
else if (dp[j] == dp[j - goods[i]] + 1)
{
dp2[j] += dp2[j - goods[i]];
}
}
}
printf("You have %d selection(s) to buy with %d kind(s) of souvenirs.
",dp2[m],all);
}
return 0;
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |