1432: 背包again
时间限制: 1 Sec 内存限制: 128 MB
提交: 246 解决: 77
[提交] [状态] [讨论版] [命题人:admin]
题目描述
Gy最近学习了01背包问题,无聊的他又想到了一个新的问题,给定n个物品的价值,和01背包一样,每个物品只能选1次或0次,求最小不能被得到的价值。
输入
第一行一个正整数T(T <= 100),表示有T组数据。
每组数据输入格式如下:
第一行为一个正整数N(N<=100),表示物品个数。
第二行N个正整数,表示每个物品的价值vi(1<=vi<=1000000)
输出
共输出T行,即每组数据相应答案。
样例输入 Copy
<span style="color:#333333"><span style="color:#333333">2
3
2 4 8
4
1 2 4 8
</span></span>
样例输出 Copy
<span style="color:#333333"><span style="color:#333333">1
16
</span></span>
来源/分类
#include<stdio.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int t;
for(int i=0;i<n;i++)//冒泡法对数组进行排序,以便处理
for(int j=0;j<i;j++)
if(a[i]<a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
int min=1;//默认最小为1
for(int i=0;i<n;i++)
{
if(a[i]==min)
{//如果当前值与前一个最小值相等,
//可以将最大值扩大一倍
//等价于min=min+a[i]
min=min*2;
}
else
{//否则,如果当前值大于前一个不能得到的最小值
//min不变
// 如果当前值小于前一个不能得到的最小值
//min=min+a[i]
if(a[i]<min)
min=min+a[i];
}
}
printf("%d\n",min);
}
return 0;
}