当前位置:网站首页>[oiclass] share prizes
[oiclass] share prizes
2022-07-06 14:48:00 【Liujincheng LJC】
Share prizes
Title Description
In the school creative knowledge competition , Mingming and Wenwen got a total of n(1≦ n≦250) A prize , Every prize has a value Vi (1 ≦ Vi ≦ 2,000). They want to share these prizes equally by value , If you can't score equally, try to minimize the gap between them . Now give the number of prizes and their value , Clearly want to calculate the minimum difference after division , And the number of schemes divided .
for example : Yes 5 The value of each prize is :2, 1,8, 4, 16. Mingming and Wenwen are divided into two parts , The first four are part 1+2+4+8=15,16 As a separate part , Then the difference between the two parts :16-15 = 1. This is the division scheme with the smallest gap , And the division method of this scheme is only 1 Kind of .
Prizes of the same value intersect and convert into different schemes , Such as : There are four prizes worth {1, 1, 1, 1}, Yes 6 There are different division schemes , Divide these prizes into two parts , Every part of it 2 A prize .
Input
first line : An integer n(1≦n≦250);
Then there was n That's ok , One integer per row Vi (1 ≦ Vi ≦ 2,000) Represents the value of each prize .
Output
first line : An integer , Represents the minimum difference between the two parts of the division .
The second line : An integer , The number of division schemes representing the minimum difference , The result is right 1,000,000 Seeking remainder (mod 1,000,000).
The sample input #1:
5
2
1
8
4
16
Sample output #1:
1
1
The sample input #2:
4
1
1
1
1
Sample output #2:
0
6
Ideas
First, we can use the idea of dynamic programming :
set up f[i][j] For the former i The value of these prizes is j Different schemes
So the equation of state transition is going to be :
f[i][j] = f[i-1][j]+f[i-1][j-a[i]]
The code written at this time is like this :
#include<bits/stdc++.h>
using namespace std;
const int MOD = 1000000;
const int N = 300;
int n,a[N],f[N][2000*N];
int maxn = 0;
int main(){
cin >> n;
for(int i=1;i<=n;i++)cin >> a[i],maxn+=a[i];
f[0][0] = 1;
for(int i=1;i<=n;i++){
for(int j=0;j<=maxn;j++){
f[i][j] = (f[i-1][j]+f[i-1][j-a[i]])%MOD;
}
}
int ans=2000*N,cnt=-1;
for(int j=0;j<=maxn;j++){
if(abs((maxn-j)-j)<ans){
ans = abs((maxn-j)-j);
cnt = f[n][j];
}
}
cout << ans << endl << cnt << endl;
return 0;
}
result : MLE
The space complexity of this code is too high . So I put f The first dimension of is changed to a scrolling array :
#include<bits/stdc++.h>
using namespace std;
const int MOD = 1000000;
const int N = 260;
int n,a[N],f[3][2000*N];
bool vis[3][2000*N];
int maxn = 0;
int main(){
cin >> n;
for(int i=1;i<=n;i++)cin >> a[i],maxn+=a[i];
f[0][0] = 1;
vis[0][0] = 1;
for(int i=1;i<=n;i++){
for(int j=0;j<=maxn;j++){
if(j-a[i]>=0){
f[i%2][j] = (f[(i-1)%2][j]+f[(i-1)%2][j-a[i]])%MOD;
vis[i%2][j]= vis[(i-1)%2][j] || vis[(i-1)%2][j-a[i]];
}
else{
f[i%2][j] = f[(i-1)%2][j];
vis[i%2][j] = vis[(i-1)%2][j];
}
}
}
int ans=2000*N,cnt=-1;
for(int j=0;j<=maxn;j++){
if(abs((maxn-j)-j)<ans and vis[n%2][j]!=0){
ans = abs((maxn-j)-j);
cnt = f[n%2][j];
}
}
cout << ans << endl << cnt << endl;
return 0;
}
This time it became TLE
Time optimization , take mod The final answer is :
#include<bits/stdc++.h>
using namespace std;
const int MOD = 1000000;
const int N = 260;
int n,a[N],sum[N],f[3][2000*N];
bool vis[3][2000*N];
int maxn = 0;
int main(){
cin >> n;
for(int i=1;i<=n;i++){
cin >> a[i];
maxn+=a[i];
sum[i]=sum[i-1]+a[i];
}
f[0][0] = 1;
vis[0][0] = 1;
for(int i=1;i<=n;i++){
int I2=i%2,I12=(i-1)%2;
for(int j=0;j<=sum[i];j++){
if(j-a[i]>=0){
f[I2][j] = f[I12][j]+f[I12][j-a[i]];
if(f[I2][j]>=MOD) f[I2][j]-=MOD;
vis[I2][j]= vis[I12][j] || vis[I12][j-a[i]];
}
else{
f[I2][j] = f[I12][j];
vis[I2][j] = vis[I12][j];
}
}
}
int ans=2000*N,cnt=-1;
for(int j=0;j<=maxn;j++){
if(abs((maxn-j)-j)<ans and vis[n%2][j]!=0){
ans = abs((maxn-j)-j);
cnt = f[n%2][j];
}
}
cout << ans << endl << cnt << endl;
return 0;
}
Turned into AC !
边栏推荐
- ES全文索引
- To brush the video, it's better to see if you have mastered these interview questions. Slowly accumulating a monthly income of more than 10000 is not a dream.
- “人生若只如初见”——RISC-V
- How to earn the first pot of gold in CSDN (we are all creators)
- 指针:最大值、最小值和平均值
- Want to learn how to get started and learn software testing? I'll give you a good chat today
- {1,2,3,2,5}查重问题
- Mysql的事务是什么?什么是脏读,什么是幻读?不可重复读?
- ByteDance ten years of experience, old bird, took more than half a year to sort out the software test interview questions
- [pointer] delete all spaces in the string s
猜你喜欢

四元数---基本概念(转载)

Keil5 MDK's formatting code tool and adding shortcuts

What level do 18K test engineers want? Take a look at the interview experience of a 26 year old test engineer

JVM memory model concept

Statistics 8th Edition Jia Junping Chapter 4 Summary and after class exercise answers

移植蜂鸟E203内核至达芬奇pro35T【集创芯来RISC-V杯】(一)

数字电路基础(四) 数据分配器、数据选择器和数值比较器

Fundamentals of digital circuits (II) logic algebra

Binary search tree concept

How to learn automated testing in 2022? This article tells you
随机推荐
c语言学习总结(上)(更新中)
Cadence physical library lef file syntax learning [continuous update]
Always of SystemVerilog usage_ comb 、always_ iff
Statistics 8th Edition Jia Junping Chapter IX summary of knowledge points of classified data analysis and answers to exercises after class
刷视频的功夫,不如看看这些面试题你掌握了没有,慢慢积累月入过万不是梦。
About the garbled code problem of superstar script
《统计学》第八版贾俊平第四章总结及课后习题答案
Markdown font color editing teaching
《统计学》第八版贾俊平第十一章一元线性回归知识点总结及课后习题答案
关于交换a和b的值的四种方法
Mysql的事务是什么?什么是脏读,什么是幻读?不可重复读?
Statistics, 8th Edition, Jia Junping, Chapter 6 Summary of knowledge points of statistics and sampling distribution and answers to exercises after class
Chain team implementation (C language)
[pointer] the array is stored in reverse order and output
flask实现强制登陆
With 27K successful entry ByteDance, this "software testing interview notes" has benefited me for life
150 common interview questions for software testing in large factories. Serious thinking is very valuable for your interview
函数:求两个正数的最大公约数和最小公倍
Function: find the maximum common divisor and the minimum common multiple of two positive numbers
Uibutton status exploration and customization