一个变形的完全背包 题是第一次团队赛的热身题...看别人博客看到这道题忽然就不会了 然后想了半天还是没想出来...上oj找了提交排名..发现自己弄出来的奇怪的办法居然用时最短...
问装m最低要多少的v
想法是枚举v 从1开始无限往后
然后就是普通的完全背包
一旦dp[k]超过了m 立即break 然后输出v
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int main(){ int t; scanf("%d",&t); while(t--) { int n,m; scanf("%d%d",&n,&m); int val[n+1]; int vol[n+1]; for(int i=1;i<=n;i++) { scanf("%d%d",&vol[i],&val[i]); } int v; for(v=1;;v++) { int h=0; int dp[v+1]; memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { if(h==1)break; for(int k=vol[i];k<=v;k++) { dp[k]=max(dp[k],dp[k-vol[i]]+val[i]); if(dp[k]>=m) { h=1; break; } } } if(h==1)break; } printf("%d ",v); } }