JZOJ__Day 6:【普及模拟】团队背包(team)
題目描述
DaA 和他的朋友組成一個團隊去旅行了。他們每個人都準備了一個背包,用來裝旅行用的物品。他們的背包有兩個特點:
1. 每個人的背包能裝無限多的物品,每種物品有一個價值,但只能裝一件;
2. 每個人都很有個性,所以每個人的背包不會完全相同。
DaA 的團隊中有M 個人,那么對于整個團隊,背包價值和最大是多少呢?
輸入
第一行兩個整數M、N,表示團隊的人數和物品的數量。
接下來一行N 個整數,表示每件物品的價值wi。
數據保證不會出現有空背包人的出現。
輸出
一個整數,整個團隊背包價值的最大值。
樣例輸入
Sample Input 1:
2 3
2 7 1
Sample Input 2:
8 4
1 2 3 4
樣例輸出
Sample Output 1:
19
Sample Output 2:
58
數據范圍限制
【數據規模】
30%的數據 1<=M,N<=15。
60%的數據 1<=M<=200,1<=N<=100。
100%的數據 1<=M<=1,000,000,1<=N<=500,0< wi<=50。
輸出請注意使用64 位整數(Pascal 中的Int64,C++中的long long)。
提示
【樣例解釋】
19=(2+7+1)+(2+7)
58=(1+2+3+4)+(2+3+4)+(1+3+4)+(1+2+4)+(3+4)+(1+2+3)+(2+4)+(2+3)
分析
用 f[i]表示價值為 i 的背包的不同種數,可以用 DP 求出:
f[i] =∑ [i?w[j]]
然后從 ∑w[j] 開始從大到小枚舉 f[i],則這 f[i]種背包的總價值為 f[i]*i。枚舉
直到人數已經大于等于 M 的為止,統計一下答案就可以了。
程序:
var i,j:longint; tj,ans,n,m:int64; a:array[0..600]of int64; f:array[0..25100]of int64; beginassign(input,'team.in');reset(input);assign(output,'team.out');rewrite(output);readln(m,n);tj:=0;for i:=1 to n dobeginread(a[i]);tj:=tj+a[i];end;f[0]:=1;for i:=1 to n dofor j:=tj downto 0 doif j>=a[i] then f[j]:=f[j]+f[j-a[i]];ans:=0;for i:=tj downto 0 doif f[i]<=m thenbeginm:=m-f[i];ans:=ans+f[i]*i;end elsebeginans:=ans+i*m;break;end;write(ans);close(input);close(output); end.轉載于:https://www.cnblogs.com/YYC-0304/p/9500088.html
總結
以上是生活随笔為你收集整理的JZOJ__Day 6:【普及模拟】团队背包(team)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JZOJ__Day 6:【普及模拟】Ol
- 下一篇: JZOJ__Day 6:【普及模拟】神奇