获得最佳卡片列表的最佳方法是什么,例如我想获得礼品卡申请订单总数为100.它应该返回最佳组合,如30 + 40 + 75。下面是我当前的代码,它在30+40 = 70
之后停止,这是错误的,因为订单总数超过70,所以我们不能仅申请两张礼品卡。它应该返回3张礼品卡,如上所示。
[Test]
public void GetBestAvailableGiftCards()
{
var list = new List<GiftCard>
{
new GiftCard() {CardNumber = "45964123358448514", SecurityCode = "032443", Balance = 75},
new GiftCard() {CardNumber = "45964123345954414", SecurityCode = "032443", Balance = 85},
new GiftCard() {CardNumber = "45964062845645735", SecurityCode = "435448", Balance = 40},
new GiftCard() {CardNumber = "28872034245533173", SecurityCode = "934465", Balance = 30}
};
var orderTotal = 100;
double current = 0;
var cards = list
.OrderBy(x => x.Balance)
.TakeWhile(card => (current = current + card.Balance) <= orderTotal)
.ToList();
}
答案 0 :(得分:6)
这是TakeWhile
的通常行为,只要指定的条件为真,它就会返回序列中的元素。
你必须调整这一点以包含下一个加法(使条件成立)。
files = glob.glob('*.txt')
files.sort()
for infile in files:
year,formatt = infile.split('.')
year = year.split('_')[1]
ws = [4,9,7,7,7,7,7,7,7,7,7,7,7]
df = pd.read_fwf(infile,widths=ws,header=9, nrows=31, keep_default_na = False)
df = df.drop('Day', 1)
df = np.array(df.T)
df = df[df != '']
data = pd.DataFrame([])
data['Discharge'] = df
data = data.set_index(pd.date_range(year, periods=len(data), freq='D'),
drop=True, append=False, inplace=False, verify_integrity=False)
new = pd.DataFrame([])
all_ = new.append(data)
print all_
选中此example
答案 1 :(得分:1)
如果我的问题是正确的,那么您正在尝试选择礼品卡的某些子集,使其余额总和尽可能接近orderTotal
,但仍然小于或等于{{1 }}。在给定的情况下,最好的选择是给用户85卡,因为没有其他组合对我来说似乎更好。
可悲的是,仅仅通过直接使用LINQ就无法解决这个问题。如果这不是NP难问题,请尝试使用一些动态算法。