链接:https://ac.nowcoder.com/acm/contest/4911
B.三角形
题目大意:
给定n个盒子,每个盒子中有一定数量的宝物,现在你每次可以从一个盒子中拿取一个宝物,这样就会有很多种不同的价值和结果。现在问你前k小的价值结果的和是多少?
n<=100,k<=10000,假设盒子中最多宝物数量为m,保证k<=n*m<=10000。宝物价值不超过100.
思路:
首先这个题容易被数据范围误导,虽然每个盒子中最多可能有m<=100个物品,但是你最多从盒子中拿走一个物品,也就是说最后的结果sum<=n*100的,最大就是10000。这样分析一下数据范围,就可以想到方案数背包了(因为k最多也就10000),dp(i,sum)表示前i个盒子中拿物品,和为sum的方案数,这样复杂度为O(n * m * sum),最大为1e8左右。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#define int long long
using namespace std;
const int maxn=10000+10;
int dp[101][maxn];
int mp[101][101];
signed main(){
int n,m;