標題:
b858: 橘子
[打印本頁]
作者:
沈子耕
時間:
2016-10-28 20:04
標題:
b858: 橘子
內容 :
吉吉喜歡橘子汁,吉吉有一堆橘子和一台擠汁機,吉吉想用擠汁機擠橘子汁,每顆橘子擠成橘子汁會花不同的時間,擠汁機同時可以擠兩顆橘子,吉吉需要多少時間才能將所有橘子擠成橘子汁。
輸入說明 :
第 1 行有一正整數 T(T <= 10),接下來有 T 筆輸入。
每筆輸入 2 行,第 1 行有一正整數 N(N <= 100),代表橘子數量。下一行有 N 個不超過 1000 的正整數,代表各橘子擠成橘子汁所需要的時間。
有 40% 的測資 N <= 10。
輸出說明 :
對於每筆輸入,輸出將全部橘子擠成橘子汁所需的最少時間。
範例輸入 :
2
3
1 2 3
4
1 4 2 3
範例輸出:
3
5
提示 :
第一筆測資,放入所需時間 1 和 3 的橘子,將所需時間 1 的橘子拿出來,放入所需時間 2 的橘子,全擠成汁需要 3 單位時間。
作者:
劉得恩
時間:
2017-2-11 15:56
#include<cstdio>
#include<cstring>
void print(bool*A,int n)
{
for(int i=0;i<n;i++)
printf("%d ",A[i]);
puts("");
}
int main()
{
bool dp[101000];
int t,lemon[105],n;
while(scanf("%d",&n)==1)
{
while(n--)
{
int sum=0;
scanf("%d",&t);
for(int i=0; i<t; i++)
{
scanf("%d",&lemon[i]);
sum+=lemon[i];
}
int h=sum/2,dpsum=0;
memset(dp,false,sizeof(dp));
dp[0]=true;
for(int i=0; i<t; i++)
{
for(int j=dpsum; j>=0; j--)
if(dp[j])dp[j+lemon[i]]=true;
dpsum+=lemon[i];
}
//print(dp,sum);
int u;
for(u=h;; u--)if(dp[u])break;
printf("%d\n",sum-u);
}
}
return 0;
}
複製代碼
歡迎光臨 種子論壇 | 高雄市資訊培育協會學員討論區 (http://seed.istak.org.tw/)
Powered by Discuz! 7.2