0
已解决
刘凯南
高级守护
高级守护
#include<bits/stdc++.h>
using namespace std;
int k[2000],num,f[2000],n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>k[i];
for(int i=1;i<=n;i++)
num+=k[i];
int m=num/2;
for(int i=1;i<=n;i++)
for(int j=m;j>=k[i];j--)
f[j]=max(f[j],f[j-k[i]]+k[i]);
cout<<abs(num-f[m]*2);
}
1
2
1
1
陆姗姗
资深守护
资深守护
仔细看题目的输入描述即可知道
输入描述 Input Description
第一行输入西瓜数量N (1 ≤ N ≤ 20)
第二行有N个数,W1, …, Wn (1 ≤ Wi ≤ 10000)分别代表每个西瓜的重量
因为1 ≤ N ≤ 20 ,所以你的数组k的范围比20稍大就可以了
因为1 ≤ Wi ≤ 10000,所以你的数组f的范围需要比10000*20/2稍大,你的f的范围太小了
1
杨陈卓
新手天翼
新手天翼
数组都要定义到200000
劝你最好不要用万能头文件
把万能头文件去掉,加上:
#include<iostream>
#include<cmath>
这两个头文件,我刚试的,100分
最后祝你提交愉快!
杨陈卓在2018-02-08 11:41:33追加了内容
定义n,f[50001],a[50001],v
输入n
for(int i=1;i<=n;i++)
{
cin>>a[i];
v+=a[i];
}
int v1=v;
v/=2;
for(int i=1;i<=n;i++)
{
for(int j=v;j>=a[i];j--)
{
f[j]=max(f[j],f[j-a[i]]+a[i]);
}
}
cout<<v1-f[v]*2;
这是另外一种思路
1
1
1
刘凯南
高级守护
高级守护
刘凯南在2018-02-07 19:11:51追加了内容
Runtime Error:0分
刘凯南的测评结果:
测试点#1测评结果 : Runtime Error时间 : 0ms偷看一下数据测试点#2测评结果 : Runtime Error时间 : 0ms偷看一下数据测试点#3测评结果 : Runtime Error时间 : 0ms偷看一下数据测试点#4测评结果 : Runtime Error时间 : 0ms偷看一下数据测试点#5测评结果 : Runtime Error时间 : 0ms偷看一下数据测试点#6测评结果 : Runtime Error时间 : 0ms偷看一下数据测试点#7测评结果 : Runtime Error时间 : 0ms偷看一下数据测试点#8测评结果 : Runtime Error时间 : 0ms偷看一下数据测试点#9测评结果 : Runtime Error时间 : 0ms偷看一下数据测试点#10测评结果 : Runtime Error时间 : 0ms偷看一下数据
我的提交(cpp):
#include<bits/stdc++.h> using namespace std; int k[10000],num,f[10000],n; int main() { cin>>n; for(int i=0;i<n;i++) cin>>k[i]; for(int i=0;i<n;i++) num+=k[i]; int m=num/2; for(int i=0;i<n;i++) for(int j=m;j>=k[i];j--) f[j]=max(f[j],f[j-k[i]]+k[i]); cout<<abs(num-f[m]-f[m]); }
0