CodeForces 364B Free Market :每次可以从已有商品换取高于价值不超过d的没有选过的价值,选最高价值 :dp/贪心

题目中规定要换来的物品必须要是目前没有的=

其实如果有重复的就可以把重复的去掉。。所以是等价的

所以可以在输入的时候预处理取与不取当前值能拿到的值放入dp中

然后在0的基础上一直寻找最大可交换的物品,一直到找不到结束==

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 int dp[600005],a[55];
 6 int main()
 7 {
 8   int sum,i,j,n,d,ans,t1,t2;
 9   memset(dp,0,sizeof(dp));
10   dp[0]=1; sum=0;
11   scanf("%d%d",&n,&d);
12   for (i=1;i<=n;i++)
13   {
14     scanf("%d",&a[i]);
15     sum+=a[i];
16     for (j=sum;j>=a[i];j--)
17       dp[j]=dp[j]||dp[j-a[i]];
18   }
19   ans=0; t1=0;
20   while (1)
21   {
22     t2=t1;
23     for (i=t2;i<=t2+d;i++)
24       if (dp[i]) t1=i;
25     if (t1==t2) break;
26     else ans++;
27   }
28   printf("%d %d\n",t1,ans);
29   return 0;
30 }
View Code

题目链接:http://codeforces.com/problemset/problem/364/B

posted on 2015-03-28 00:24  xiao_xin  阅读(174)  评论(0编辑  收藏  举报

导航