NYOJ311-完全背包
完全背包
時間限製:3000 ms 內存限製:65535 KB
難度:4
描述
直接說題意,完全背包定義有N種物品和一個容量為V的背包,每種物品都有無限件可用。第i種物品的體積是c,價值是w。求解將哪些物品裝入
背包可使這些物品的體積總和不超過背包容量,且價值總和最大。本題要求是背包恰好裝滿背包時,求出最大價值總和是多少。如果不能恰好
裝滿背包,輸出NO
輸入
第一行: N 表示有多少組測試數據(N7)。
接下來每組測試數據的第一行有兩個整數M,V。 M表示物品種類的數目,V表示背包的總容量。(0M=2000,0V=50000)
接下來的M行每行有兩個整數c,w分別表示每種物品的重量和價值(0c100000,0w100000)
輸出
對應每組測試數據輸出結果(如果能恰好裝滿背包,輸出裝滿背包時背包內物品的最大價值總和。 如果不能恰好裝滿背包,輸出NO)
樣例輸入
2
1 5
2 2
2 5
2 2
5 1
樣例輸出
NO
1
AC代碼:
<p>#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int INF = -2147483647; int w[2100],v[2100],dp[51000]; int max(int a,int b) { return a>b?a:b; } int main() { int i,j,T,n,m; scanf("%d",&T); while(T--) { scanf("%d %d",&n,&m); memset(dp,0,sizeof(dp));//後期全靠dp[0]==0了 for(i=1;i<=n;i++) scanf("%d %d",&w[i],&v[i]); for(i=1;i<=m;i++) dp[i]=INF; for(i=1;i<=n;i++) for(j=w[i];j<=m;j++) dp[j]=max(dp[j],dp[j-w[i]]+v[i]); if(dp[m]>=0) printf("%d\n",dp[m]); else printf("NO\n"); } return 0; }</p>
最後更新:2017-04-03 12:56:25