1. 程式人生 > >二維揹包+列出物品選擇

二維揹包+列出物品選擇

#include<cstdio>
#include<algorithm>
using namespace std;
int n,a[1001],f[1001][10001],s,v[1001],Max;
void print(int sum,int x){
	if(x==0||sum==0) return;
	if(f[sum-1][x]==f[sum][x]) print(sum-1,x);
	else{ 
		print(sum-1,x-a[sum]);
		printf("\n%d %d %d",sum,a[sum],v[sum]); 
	}
}
int main(){
	scanf("%d%d",&n,&s);
	for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&v[i]);
	for(int i=1;i<=n;i++)
		for(int j=s;j>=0;j--)
			if(j<a[i]) f[i][j]=f[i-1][j];
			else f[i][j]=max(f[i-1][j],f[i-1][j-a[i]]+v[i]);
	printf("%d",f[n][s]);
	print(n,s);
}