閱讀976 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go 九度題目1529:棋盤尋寶
  下一篇:go 龐果網之高斯公式