一個變形的完全背包 題是第一次團隊賽的熱身題...看別人博客看到這道題忽然就不會了 然后想了半天還是沒想出來...上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\n",v); } }
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。