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 }