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

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

所以可以在输入的时候预处理取与不取当前值能拿到的值放入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

相关文章:

  • 2022-12-23
  • 2022-02-06
  • 2021-10-25
  • 2022-01-16
  • 2021-11-29
  • 2021-06-12
  • 2021-11-21
猜你喜欢
  • 2021-09-29
  • 2021-07-10
  • 2022-02-17
  • 2021-12-23
  • 2021-12-12
  • 2021-12-02
  • 2021-05-05
相关资源
相似解决方案