UVA-624

题目
あなたは車の前方にして、長いドライブを持っています。あなたはテープレコーダーを持っているが、残念ながら、あなたの最高の音楽は、上にある
CDの。あなたはテープを持っているN分長い:あなたは解決する問題があるので、テープにそれを持っている必要があります。どのように
テープスペースのほとんどを取得し、可能な限り短い未使用領域として持っているCDから曲を選択します。
仮定:
•CDのトラック数が20を超えていない
•何のトラックがN分以上ではありません
•トラックは繰り返さない
各トラックの長さが整数として表現される•
Nは整数もある•
プログラムは、そのトラックのセットを見つける必要がありますテープ最高満たし、同じ順序でそれを印刷
トラックがCDの上に格納されている
入力
任意の数の行。各トラックとの期間の数(空間後)値N、含ま
トラック。サンプルデータの最初の行から、例えば:= 5 N、トラック= 3の数は、最初のトラックは1継続
分、二番目の3分、次の4分の
出力
正解文字列であるトラック(および持続時間)のセット「合計:」と期間の合計
時間。
サンプル入力
5 3 1 3 4
10 4 9 8 4 2
20 4 10 5 7 4
2 3 4 5 7 90 8 10 23 1
45 8 4 10 44 43 12 9 8 2
出力例
1~4和:5
8 2合計: 10
10 5 4合計:19
10 23 1 2 3 4 5 7合計:55
4 10 12 9 8 2合計:45
题目大意
あなたは空のテープを持っているn個分長い、最初トンの好きな音楽があり、音楽のi番目の部分の長さは、[I]があります。あなたは、テープ・レコード・音楽に成長する必要がある場合ので、できる限り短く時間を残りのテープは、記録された音楽テープ、選択された楽曲の長押し入力出力順序に入って来ること。
問題解決のためのアイデアは
、明らかに01ナップザック問題です。記事の長さは、T音楽に対応する場合、n個分長いテープがバックパックの空き容量に対応します。
しかし、問題を解決することの難しさは、長い時間の音楽である出力オプションです。
F [i]が[j]はそのように選択フロント私の歌を示したときに、曲の長さjの複数、および、記録F [i] [j]の達成可能な最大長JA [I]> = 0のときF [ I] [J] = MAX(F [I]、[J]、F [I-1] [JA [I]] + A [I])JA [I] <0のときF [I] [J] = F [I-1]〜[J ] 我々は最大の長さと時間の最大の長さは逆プッシュバック、長い出力選曲を見つけることができるようにします。(第一段階に、i番目の段階を行うことにより、I-1の比較方法)



#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int a[10101],u[101],f[30][101010];
int tot,nbr;
int main()
{
	int v,n;
	while (~scanf("%d",&v))
	{
		scanf("%d",&n);
		for (int i=1;i<=n;i++)
		  scanf("%d",&a[i]);
		memset(f,0,sizeof(f));  
		for (int i=1;i<=n;i++)
		  for (int j=0;j<=v;j++)
		    {
		    f[i][j]=f[i-1][j];
		    if (j-a[i]>=0) f[i][j]=max(f[i][j],f[i-1][j-a[i]]+a[i]);
		    }
		int val;
		nbr=0;    
		for (int i=1;i<=v;i++)
		  if (f[n][i]!=0) val=f[n][i]; 
		tot=val;   
		for (int i=n;i>=1;i--) 
		{
			if (f[i][val]==f[i-1][val-a[i]]+a[i])
			{
				val-=a[i];
				u[++nbr]=a[i];
			}
		}   
		for (int i=nbr;i>=1;i--)
		  printf("%d ",u[i]);
		printf("sum:%d\n",tot);    
	}
}
公開された12元の記事 ウォンの賞賛0 ビュー127

おすすめ

転載: blog.csdn.net/weixin_45723759/article/details/103978113