第十九届西南科技大学ACM程序设计竟赛 (同步赛)

E

image-20230510003525674

  • 01背包的变形,背包的容量是所有数字的总和,然后从数组中选择适当的元素放入背包,价值和代价都是元素的值。f[x]是x容量下最多可以装多少东西。题目要求装的东西的量各不相同,所以最后需要用set去重。

  • 不去重的话结果如图

    image-20230510003605462

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "bits/stdc++.h"
using namespace std;
int a[1005],f[10005];
set<int>s;
int main(){
int n;
cin>>n;
int idx=0,sum=0,ans=0;
for(int i=1;i<=n;i++){
cin>>a[i];
sum+=a[i];
}
for(int i=1;i<=n;i++)
for(int j=sum;j>=a[i];j--){
f[j]=max(f[j],f[j-a[i]]+a[i]);
}
for(int i=1;i<=sum;i++){
if(f[i]) {
s.insert(f[i]); //去重
// cout<<f[i]<<endl;
}
}
cout<<s.size();
return 0;
}
Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2015-2026 John Doe
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信