題目背景
y是個大建築師,他總能用最簡單的積木拼出最有創意的造型。
題目描述
y手上有n盒積木,每個積木有個重量。現在他想從每盒積木中拿一塊積木,放在一起,這一堆積木的重量為每塊積木的重量和。現在他想知道重量和最小的k種取法的重量分別是多少。(只要任意更換一塊積木,就視為一種不同的取法。如果多種取法重量總和一樣,我們需要輸出多次。)
輸入輸出格式
輸入格式:
第一行輸入兩個整數,n,k,意義如題目所描述。
每組資料接下來的n行,第乙個整數為mi,表示第i盒積木的數量,在同一行有mi個整數,分別表示每個積木的重量。
輸出格式:
一行,重量最小的k種取法的重量,要求對於每個資料,從小到大輸出
輸入輸出樣例
輸入樣例#1:
3 10
4 1 3 4 5
3 1 7 9
4 1 2 3 5
輸出樣例#1:
3 4 5 5 6 6 7 7 7 7
說明對於30%的資料:2<=mi<=10,1<=n<=10
對於50%的資料:2<=mi<=50,1<=n<=50
對於100%的資料:2<=mi<=100,1<=n<=100,1<=k<=10000,每個積木的重量為不超過100的正整數,所有mi的積大於等於k。本題不卡常。
【分析】
這就是個分組揹包的變式題…
【**】
//洛谷月賽 1.y的積木
#include
#include
#include
#include
#include
#define ll long long
#define m(a) memset(a,0,sizeof a)
#define fo(i,j,k) for(i=j;i<=k;i++)
using
namespace
std;
int n,m,k;
int wei[105][105],sum[105];
int dp[105][10005];
int main()
sum[i]=sum[i-1]+mx;
}dp[0][0]=1;
fo(i,1,n)
}for(i=1;i<=10000 && k;i++)
while(dp[n][i] && k)
printf("%d ",i),k--,dp[n][i]--;
return
0;}
動態規劃入門 洛谷P2409 Y的積木
y是個大建築師,他總能用最簡單的積木拼出最有創意的造型。y手上有n盒積木,每個積木有個重量。現在他想從每盒積木中拿一塊積木,放在一起,這一堆積木的重量為每塊積木的重量和。現在他想知道重量和最小的k種取法的重量分別是多少。只要任意更換一塊積木,就視為一種不同的取法。如果多種取法重量總和一樣,我們需要輸...
洛谷 P2409 小Y的積木 (dp)
y是個大建築師,他總能用最簡單的積木拼出最有創意的造型。y手上有n盒積木,每個積木有個重量。現在他想從每盒積木中拿一塊積木,放在一起,這一堆積木的重量為每塊積木的重量和。現在他想知道重量和最小的k種取法的重量分別是多少。只要任意更換一塊積木,就視為一種不同的取法。如果多種取法重量總和一樣,我們需要輸...
洛谷2409Y的積木(二分答案)
題目背景 y是個大建築師,他總能用最簡單的積木拼出最有創意的造型。題目描述 y手上有n盒積木,每個積木有個重量。現在他想從每盒積木中拿一塊積木,放在一起,這一堆積木的重量為每塊積木的重量和。現在他想知道重量和最小的k種取法的重量分別是多少。只要任意更換一塊積木,就視為一種不同的取法。如果多種取法重量...