题面:
有一组物品,每个物品的最大重量不大于 8。要求出最大的子集在总重量不超过W的情况下的最大重量(cnt<=10^16,W<=10^18)
思路:
因为物品的重量最大只有8,所以会想到用一些暴力复杂度的方法,如O(2^8)或O(8^8)
发现直接暴力枚举每种物品的个数会TLE。
想到每组数穷举时从大到小,最多向下穷举9次!
于是出现了O(9^8)的复杂度方法
Code:
#include<bits/stdc++.h>
using namespace std;
long long W,cnt[10],ans;
void dfs(int id,long long sum){
if(id>8){
ans=max(ans,sum);
return;
}
long long res=min(cnt[id],(W-sum)/id)//最多能取几个;
for(int i=1;i<=9;i++){
dfs(id+1,sum+max(0ll,res*id));
res--;
}
}
int main(){
scanf("%lld",&W);
for(int i=1;i<=8;i++) scanf("%lld",&cnt[i]);
dfs(1,0);
printf("%lld",ans);
return 0;
}
附录:
本作者平生第一篇题解
开心
189

被折叠的 条评论
为什么被折叠?



